У меня есть этот код, который устанавливает значок на панели задач, но я не могу, когда кто-то делает правый / левый щелчок по нему. Есть способ сделать это?
//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;
Может ли кто-нибудь помочь мне, пожалуйста? Спасибо
То, о чем вы просите, описано в документации MSDN для Shell_NotifyIcon()
:
NIF_MESSAGE (0x00000001)
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)
содержит идентификатор значка Идентификаторы значков ограничены длиной 16 бит.
GET_X_LPARAM(wParam)
возвращает координату привязки X для событий уведомлений NIN_POPUPOPEN, NIN_SELECT, NIN_KEYSELECT и всех сообщений мыши между WM_MOUSEFIRST и WM_MOUSELAST. Если какое-либо из этих сообщений генерируется клавиатурой,wParam
установлен в верхнем левом углу иконки цели. Для всех остальных сообщенийwParam
не определено
GET_Y_LPARAM(wParam)
возвращает координату привязки Y для уведомлений и событий, как определено для привязки X.
Когда вы добавляете значок уведомления, вам необходимо:
Укажите hWnd
который будет получать уведомления от значка.
Укажите nID
или же guidItem
идентифицировать значок. Если вы используете guidItem
и отображая несколько значков, уведомления не смогут сказать вам, какой значок уведомляет вас, поэтому вам придется использовать отдельный HWND для каждого значка. Также, guidItem
на самом деле более ограничен в функциональности, чем nID
и вызывает больше проблем, чем решает, поэтому я настоятельно рекомендую держаться подальше от guidItem
в целом и всегда использовать nID
только.
включить NIF_MESSAGE
пометить и предоставить пользовательский uCallbackMessage
ID сообщения
Затем оконная процедура HWND будет получать идентификатор сообщения всякий раз, когда пользователь взаимодействует со значком. Сообщение 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);
}
Других решений пока нет …