//创建IOCN
void SetIoc(HWND hwnd)
{
WNDCLASS wndclass;
if(hwnd==NULL)
{
MessageBox(NULL, TEXT("应用程序创建托盘处理失败!"), szAppClassName, MB_ICONERROR);return ;
}
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = NULL;
HICON hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));
wndclass.hIcon =hIcon;
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppClassName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("此程序需要Windows NT!"), szAppClassName, MB_ICONERROR);
return ;
}
hwnd = CreateWindowEx(WS_EX_TOOLWINDOW,szAppClassName, szAppWindowName,WS_POPUP,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL, NULL, NULL, NULL);
ShowWindow(hwnd, 0);
UpdateWindow(hwnd);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
NOTIFYICONDATA nid;
UINT WM_TASKBARCREATED;
POINT pt;//用于接收鼠标坐标
int xx;//用于接收菜单选项返回值
// 不要修改TaskbarCreated,这是系统任务栏自定义的消息
WM_TASKBARCREATED = RegisterWindowMessage(TEXT("TaskbarCreated"));
switch (message)
{
case WM_CREATE://窗口创建时候的消息.
nid.cbSize = sizeof(nid);
nid.hWnd = hwnd;
nid.uID = IDI_ICON1;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_USER;
nid.hIcon = ::LoadIcon(::GetModuleHandle(NULL),MAKEINTRESOURCE(IDI_ICON1));
lstrcpy(nid.szTip, szAppClassName);
Shell_NotifyIcon(NIM_ADD, &nid);
hmenu=CreatePopupMenu();//生成菜单
if(SetTuioMode==0)
AppendMenu(hmenu,MF_UNCHECKED,ID_Tuio,TuioModeText);
else
AppendMenu(hmenu,MF_CHECKED,ID_Tuio,TuioModeText);
if(SetMouseMode==0)
AppendMenu(hmenu,MF_UNCHECKED,ID_Mouse,MouseModeText );
else
AppendMenu(hmenu,MF_CHECKED,ID_Mouse,MouseModeText );
if(SetCalibration==0)
AppendMenu(hmenu,MF_UNCHECKED,ID_Calibration,CalibrationText );
else
AppendMenu(hmenu,MF_CHECKED,ID_Calibration,CalibrationText );
if(SetBoot_up ==1)
AppendMenu(hmenu,MF_CHECKED,ID_Boot_up,Boot_upText );
else if( SetBoot_up ==2)
AppendMenu(hmenu,MF_UNCHECKED,ID_Boot_up,Boot_upText );
AppendMenu(hmenu,MF_STRING,ID_Close_Exit,Close_ExitText);
break;
case WM_USER://连续使用该程序时候的消息.
/* if (lParam == WM_LBUTTONDOWN)
MessageBox(hwnd, TEXT("Win32 API 实现系统托盘程序,双击托盘可以退出!"), szAppClassName, MB_OK);*/
//双击托盘的消息,退出.
if (lParam == WM_LBUTTONDBLCLK)
{
Close_Exit = true ;
Sleep(100);
SendMessage(hwnd, WM_CLOSE, wParam, lParam);
}
if (lParam == WM_RBUTTONDOWN)
{
GetCursorPos(&pt);//取鼠标坐标
::SetForegroundWindow(hwnd);//解决在菜单外单击左键菜单不消失的问题
// EnableMenuItem(hmenu,ID_Close_Exit,MF_GRAYED);//让菜单中的某一项变灰
xx=TrackPopupMenu(hmenu,TPM_RETURNCMD,pt.x,pt.y,NULL,hwnd,NULL);//显示菜单并获取选项ID
//开机启动
if(xx==ID_Boot_up)
{
SetBoot_up = SetBootUp(3);
if( SetBoot_up==2)
{
if(MessageBox(NULL ,"确定跟随Windows系统一起启动吗?", "图灵识别互动系统", MB_YESNO)==IDYES)
{
if( SetBootUp(1)==0)
CheckMenuItem(hmenu, ID_Boot_up, MF_CHECKED);
}
}
else if( SetBoot_up==1)
{
if(MessageBox(NULL ,"确定关闭Windows系统一起启动吗?", "图灵识别互动系统", MB_YESNO)==IDYES)
{
if(SetBootUp(2)==0)
CheckMenuItem(hmenu, ID_Boot_up, MF_UNCHECKED);
}
}
}
//开启鼠标模式
if(xx==ID_Mouse)
{
SetMouseMode= GetPrivateProfileInt("设置", "SetMouseMode", 0, strPath);
if(SetMouseMode==0)
{
CheckMenuItem(hmenu, ID_Mouse, MF_CHECKED);
WritePrivateProfileString("设置", "SetMouseMode", "1", strPath);
SetMouseMode=1;
}
else
{
CheckMenuItem(hmenu, ID_Mouse, MF_UNCHECKED);
WritePrivateProfileString("设置", "SetMouseMode", "0", strPath);
SetMouseMode= 0;
}
}
//TUIO模式
if(xx==ID_Tuio)
{
SetTuioMode= GetPrivateProfileInt("设置", "SetTuioMode", 0, strPath);
if(SetTuioMode==0)
{
CheckMenuItem(hmenu, ID_Tuio, MF_CHECKED);
WritePrivateProfileString("设置", "SetTuioMode", "1", strPath);
SetTuioMode =1;
}
else
{
CheckMenuItem(hmenu, ID_Tuio, MF_UNCHECKED);
WritePrivateProfileString("设置", "SetTuioMode", "0", strPath);
SetTuioMode =0;
}
}
//关闭系统
if(xx ==ID_Close_Exit)
{
Close_Exit = true ;
Sleep(100);
SendMessage(hwnd, WM_CLOSE, wParam, lParam);
}
if(xx==0) PostMessage(hwnd,WM_LBUTTONDOWN,NULL,NULL);
//MessageBox(hwnd, TEXT("右键"), szAppName, MB_OK);
}
break;
case WM_DESTROY://窗口销毁时候的消息.
Shell_NotifyIcon(NIM_DELETE, &nid);
PostQuitMessage(0);
break;
//捕获系统关机和注销的方法
case WM_QUERYENDSESSION:
Close_Exit = true ;
Sleep(300);
//如果以下面的代码执行 ,系统关机和注销都会提示被阻止
/* if(lParam == 0)
{
Close_Exit = true ;
Sleep(200);
MessageBox(0,"收到关机或重启消息","关机",MB_OK);
return 1 ;
}
else
{
Close_Exit = true ;
Sleep(200);
MessageBox(0,"收到注销消息………………………………","0x80000000",MB_OK);
return 1 ;
}*/
break;
//不管系统有没有关闭再次捕获关闭信息
case WM_ENDSESSION:
Close_Exit = true ;
Sleep(300);
break;
default:
/*
* 防止当Explorer.exe 崩溃以后,程序在系统系统托盘中的图标就消失
*
* 原理:Explorer.exe 重新载入后会重建系统任务栏。当系统任务栏建立的时候会向系统内所有
* 注册接收TaskbarCreated 消息的顶级窗口发送一条消息,我们只需要捕捉这个消息,并重建系
* 统托盘的图标即可。
*/
if (message == WM_TASKBARCREATED)
SendMessage(hwnd, WM_CREATE, wParam, lParam);
break;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
在Min函数:
while(GetMessage(&msg,NULL, 0, 0))
{
if(msg.message ==WM_HOTKEY)
{
if(msg.wParam == 0x0001)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}