Значок уведомления Нажмите Win32 Api в стек переполнения

У меня есть этот код, который устанавливает значок на панели задач, но я не могу, когда кто-то делает правый / левый щелчок по нему. Есть способ сделать это?

//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;

Может ли кто-нибудь помочь мне, пожалуйста? Спасибо

-2

Решение

То, о чем вы просите, описано в документации MSDN для Shell_NotifyIcon():

Структура NOTIFYICONDATA

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.

Когда вы добавляете значок уведомления, вам необходимо:

  1. Укажите hWnd который будет получать уведомления от значка.

  2. Укажите nID или же guidItem идентифицировать значок. Если вы используете guidItem и отображая несколько значков, уведомления не смогут сказать вам, какой значок уведомляет вас, поэтому вам придется использовать отдельный HWND для каждого значка. Также, guidItem на самом деле более ограничен в функциональности, чем nIDи вызывает больше проблем, чем решает, поэтому я настоятельно рекомендую держаться подальше от guidItem в целом и всегда использовать nID только.

  3. включить 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);
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]