MSDN文档中涵盖了您的要求
Shell_NotifyIcon()
:
NOTIFYICONDATA structure
NIF_消息(0x00000001)
这个
uCallbackMessage
成员有效
uCallback消息
类型:UINT
应用程序定义的消息标识符。系统使用此标识符向中标识的窗口发送通知消息
hWnd
。这些通知消息在以下情况下发送:
鼠标事件或鼠标悬停发生在图标的边框中
当使用键盘选择或激活图标时,或者当气球通知中发生这些操作时。
当
uVersion
成员为0或NOTIFYICON_VERSION,则
wParam
lParam
参数保存与事件关联的鼠标或键盘消息。例如,当指针移动到任务栏图标上时,
l参数
设置为WM_MOUSEMOVE。
当
uCallback消息
成员,但对
l参数
和
w参数
该消息的参数更改如下:
-
LOWORD(lParam)
包含通知事件,例如NIN_BALLONSHOW、NIN_POPUPOPEN或WM_CONTEXTMENU。
-
HIWORD(lParam)
包含图标ID。图标ID的长度限制为16位。
-
GET_X_LPARAM(wParam)
w参数
设置为目标图标的左上角。对于所有其他消息,
w参数
未定义。
-
GET_Y_LPARAM(wParam)
返回为X锚点定义的通知事件和消息的Y锚点坐标。
添加通知图标时,您需要:
-
指定一个
hWnd(小时/分钟)
-
指定一个
nID
或
guidItem
以识别图标。如果您使用
guidItem(guidItem)
并显示多个图标,通知将无法告诉您哪个图标正在通知您,因此您必须为每个图标使用单独的HWND。而且
guidItem(guidItem)
实际上在功能上比
,导致的问题比解决的问题多,所以我强烈建议远离
guidItem(guidItem)
全部并始终使用
国家识别码
只有
-
启用
NIF_MESSAGE
标记,并提供自定义
uCallback消息
消息ID。
当用户与图标交互时,HWND的窗口程序将接收消息ID。消息是
WPARAM
和
LPARAM
值将描述操作。
例如:
#define APPWM_ICONNOTIFY (WM_APP + 1)
...
HICON hIcon = static_cast<HICON>(LoadImage(NULL,
TEXT("gui\\sample.ico"),
IMAGE_ICON,
0, 0,
LR_DEFAULTCOLOR | LR_SHARED | LR_DEFAULTSIZE | LR_LOADFROMFILE));
SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
//Notification
NOTIFYICONDATA nid = {};
nid.cbSize = sizeof(nid);
nid.hWnd = hwnd;
nid.uID = 1;
nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
nid.uCallbackMessage = APPWM_ICONNOTIFY;
nid.hIcon = hIcon;
// This text will be shown as the icon's tooltip.
StringCchCopy(nid.szTip, ARRAYSIZE(nid.szTip), title);
// Show the notification.
Shell_NotifyIcon(NIM_ADD, &nid);
...
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case APPWM_ICONNOTIFY:
{
switch (lParam)
{
case WM_LBUTTONUP:
//...
break;
case WM_RBUTTONUP:
//...
break;
}
return 0;
}
//...
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}