Jos*_*ose -2 c++ api winapi click notifyicon
我有这段代码在任务栏中设置了一个图标,但是当某人右击或左击它时却无法执行。有没有办法做到这一点?
//Notification
NOTIFYICONDATA nid = {};
nid.hWnd = hwnd;
nid.cbSize = sizeof(nid);
nid.uFlags = NIF_ICON | NIF_TIP | NIF_GUID;
// Note: This is an example GUID only and should not be used.
// Normally, you should use a GUID-generating tool to provide the value to
// assign to guidItem.
HICON hIcon = static_cast<HICON>(LoadImage(NULL,
TEXT("gui\\sample.ico"),
IMAGE_ICON,
0, 0,
LR_DEFAULTCOLOR | LR_SHARED | LR_DEFAULTSIZE | LR_LOADFROMFILE));
static const GUID myGUID =
{ 0x23977b55, 0x10e0, 0x4041,{ 0xb8, 0x62, 0xb1, 0x95, 0x41, 0x96, 0x36, 0x68 } };
nid.guidItem = myGUID;
nid.hIcon = hIcon;
// This text will be shown as the icon's tooltip.
StringCchCopy(nid.szTip, ARRAYSIZE(nid.szTip), title);
SendMessage(nid.hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
SendMessage(nid.hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
//TaskBar
// Show the notification.
Shell_NotifyIcon(NIM_ADD, &nid) ? S_OK : E_FAIL;
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?谢谢
MSDN的文档涵盖了您的要求Shell_NotifyIcon()
:
NIF_MESSAGE(00000001)
的uCallbackMessage
构件是有效的
uCallbackMessage
类型:UINT应用程序定义的消息标识符。系统使用该标识符将通知消息发送到中标识的窗口
hWnd
。当图标的边界矩形中发生鼠标事件或鼠标悬停时,使用键盘选择或激活图标时或在气球通知中发生这些操作时,将发送这些通知消息。当
uVersion
成员为0或NOTIFYICON_VERSION时,wParam
消息的参数包含事件发生在其中的任务栏图标的标识符。该标识符的长度可以为32位。该lParam
参数保存与事件关联的鼠标或键盘消息。例如,当指针移到任务栏图标上时,lParam
设置为WM_MOUSEMOVE。当
uVersion
成员为NOTIFYICON_VERSION_4时,应用程序将继续通过该uCallbackMessage
成员以应用程序定义的消息的形式接收通知事件,但是对该消息的lParam
和wParam
参数的解释如下:
LOWORD(lParam)
包含通知事件,例如NIN_BALLOONSHOW,NIN_POPUPOPEN或WM_CONTEXTMENU。
HIWORD(lParam)
包含图标ID。图标ID的长度限制为16位。
GET_X_LPARAM(wParam)
返回通知事件NIN_POPUPOPEN,NIN_SELECT,NIN_KEYSELECT以及WM_MOUSEFIRST和WM_MOUSELAST之间的所有鼠标消息的X锚点坐标。如果这些消息中的任何一个由键盘生成,则将wParam
其设置为目标图标的左上角。对于所有其他消息,wParam
为undefined。
GET_Y_LPARAM(wParam)
返回针对X锚定义的通知事件和消息的Y锚坐标。
添加通知图标时,您需要:
指定一个hWnd
将从图标接收通知的。
指定nID
或guidItem
来标识图标。如果使用guidItem
并显示多个图标,则通知将无法告诉您哪个图标正在通知您,因此您必须为每个图标使用单独的HWND。另外,guidItem
实际上在功能上比限制更严格nID
,并且所引起的问题超出了解决的范围,因此,我强烈建议guidItem
完全远离并始终使用nID
。
启用该NIF_MESSAGE
标志,并提供自定义uCallbackMessage
消息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);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3126 次 |
最近记录: |