[摘要]NIF_TIP; nid.uCallbackMessage = WM_SSLAUNCHICONNOTIFY; nid.hIcon=LoadIcon(GetWindowInstance(hwn...
NIF_TIP;
nid.uCallbackMessage = WM_SSLAUNCHICONNOTIFY;
nid.hIcon=LoadIcon(GetWindowInstance(hwnd),
KEINTRESOURCE(IDI_SSLAUNCH));
lstrcpyn(nid.szTip,g_szAppName,sizeof(nid.szTip) /sizeof(nid.szTip[0]));
return(Shell_NotifyIcon(NIM_ADD, &nid))
}
b.任务栏通知区图标的删除
应用程序退出时,应该删除任务通知区上相应的图标:
void SSLaunch_OnDestroy(HWND hwnd)
{
// Remove the notification icon from the taskbar
NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.hWnd = hwnd;
nid.uID = IDI_SSLAUNCH;
Shell_NotifyIcon(NIM_DELETE, &nid);
}
c.应用程序定义回调消息的接收
若为任务栏通知区指定了回调消息,则系统会于鼠标事件在此区域发生时
向应用程序发送此消息,其中wParam是任务栏通知区图标标识,lParam
是鼠标事件发生后的鼠标信息。
void SSLaunch_OnIconNotify(WPARAM wParam, LPARAM lParam)
{
UINT uID = (UINT)wParam;
UINT uMsg = (UINT)lParam;
if(uID == IDI_SSLAUNCH){
switch(uMsg){
case WM_LBUTTONDOWN :
//Do something
break;
case WM_LBUTTONUP :
//Do something
break;
default :
break;
}
}
}
2.禁止多个Win32实例
在讨论禁止多个Win32实例之前,我们先讨论一下WinMain函数。我们知道,任何一个基于GDI的Windows程序以WinMain函数作为入口被系统调用。在Win16中,hPrevInstance指向前一个实例的句柄,但在Win32中,每一个进程都有一个独立的4G地址空间,从0到2G属于进程私有,对其他进程来说是不可见的。所以,在Win32中,hPrevInstance总是为NULL。
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // pointer to command line
int nCmdShow // show state of window
);
因而,在Win32下不能通过判断hPrevInstance是否为NULL来判断一个程序的另一个实例是否存在,要用其他的方法来判断。
方法一
用FindWindow 函数查找指定窗口,如果成功,则返回要找的窗口的句柄,否则返回NULL,由此可判断是否有程序的另一个实例存在。
下图的代码片段演示如何使用FindWindow函数:
TCHAR szClassName[] = _TEXT("My Wnd Class");
TCHAR szWndName[] = _TEXT("My Wnd");
HWND hWnd = FindWindow(szClassName,szWndName);
if(hWnd){
MessageBox(NULL, _TEXT("Another Instance is already running."), _TEXT("Information"),
MB_OK
关键词:从任务通知区打开屏幕保护程序