#include "WinConsoleTray.h"
#define SERVICENAME L"托盘程序"#define SWM_SHOW WM_APP + 1
#define SWM_HIDE WM_APP + 2
#define SWM_EXIT WM_APP + 3
#define WM_NOTIFYICON (WM_USER+100)
HWND g_hMainWnd=NULL;
HWND g_hTrayWnd=NULL;
NOTIFYICONDATA g_struNotifyIconData;
void ShowContextMenu(HWND hWnd);
LRESULT CALLBACK TrayWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
BOOL isProcessFlag=0;
switch(uMsg)
{
case WM_NOTIFYICON:
{
switch(lParam)
{
case WM_RBUTTONUP:
{
//显示菜单
ShowContextMenu(hWnd);
isProcessFlag=TRUE;
}
break;
case WM_LBUTTONUP:
{
if(IsWindowVisible(g_hMainWnd))
ShowWindow(g_hMainWnd,SW_HIDE);
else
{
ShowWindow(g_hMainWnd,SW_SHOWNORMAL);
SetFocus(g_hMainWnd);
}
isProcessFlag=TRUE;
}
break;
default:
break;
}
}
break;
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case SWM_SHOW:
{
ShowWindow(g_hMainWnd,SW_SHOWNORMAL);
SetFocus(g_hMainWnd);
}
break;
case SWM_HIDE:
ShowWindow(g_hMainWnd,SW_HIDE);
break;
case SWM_EXIT:
{
Shell_NotifyIcon(NIM_DELETE, &g_struNotifyIconData);
SendMessage(g_hMainWnd, WM_CLOSE, 0, 0 );
}
break;
default:
break;
}
break;
}
default:
break;
}
if(isProcessFlag)
return 0;
else
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
void ShowContextMenu(HWND hWnd)
{
POINT pt;
HMENU hMenu = CreatePopupMenu();
GetCursorPos(&pt);
if(hMenu)
{
if( IsWindowVisible(g_hMainWnd))
InsertMenu(hMenu, -1, MF_BYPOSITION, SWM_HIDE, L"隐藏");
else
InsertMenu(hMenu, -1, MF_BYPOSITION, SWM_SHOW, L"显示");
InsertMenu(hMenu, -1, MF_BYPOSITION, SWM_EXIT, L"关闭");
SetForegroundWindow(hWnd);
TrackPopupMenu(hMenu, TPM_BOTTOMALIGN,pt.x, pt.y, 0, hWnd, NULL );
DestroyMenu(hMenu);
}
}
long StartTray(HICON hIcon)
{
HWND hMainWnd=GetForegroundWindow();
g_hMainWnd=hMainWnd;
//设置标题栏图标
SendMessage(hMainWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
SendMessage(hMainWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
//创建托盘窗口
HWND hTrayWnd = ::CreateWindowA( "#32770", NULL, WS_OVERLAPPED, 0, 0, 2, 3, NULL, NULL, GetModuleHandleA(NULL),NULL );
if(hTrayWnd==NULL)
return -1;
g_hTrayWnd=hTrayWnd;
SetWindowLongA(hTrayWnd, GWL_WNDPROC, (LONG)TrayWndProc);
ShowWindow( hTrayWnd, SW_HIDE );
UpdateWindow(hTrayWnd);
//设置托盘通知
NOTIFYICONDATA struNotifyData;
struNotifyData.cbSize=sizeof(NOTIFYICONDATA);
struNotifyData.hIcon=hIcon;
struNotifyData.hWnd=hTrayWnd;
wcscpy(struNotifyData.szTip, SERVICENAME);
struNotifyData.uCallbackMessage=WM_NOTIFYICON;
struNotifyData.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
struNotifyData.uID=104;
Shell_NotifyIcon(NIM_ADD,&struNotifyData);
//气泡显示
struNotifyData.cbSize=sizeof(NOTIFYICONDATA);
struNotifyData.uFlags = NIF_INFO;
struNotifyData.uTimeout = 1000;
struNotifyData.dwInfoFlags = NIIF_INFO;
wcscpy(struNotifyData.szTip, SERVICENAME);
wcscpy(struNotifyData.szInfoTitle, SERVICENAME);
Shell_NotifyIcon(NIM_MODIFY, &struNotifyData);
g_struNotifyIconData=struNotifyData;
return 0;
}
//在主线程while里调用,捕捉Windows消息
long TrayHandle()
{
MSG Msg;
ZeroMemory(&Msg, sizeof(MSG));
GetMessage(&Msg, NULL, 0, 0);
TranslateMessage(&Msg);
DispatchMessage(&Msg);
return 0;
}