Как зафиксировать действие пользователя при нажатии на уведомления - PullRequest
0 голосов
/ 30 января 2020

В настоящее время я хочу показать всплывающее уведомление на Windows, затем я хочу захватить действие , когда пользователь нажимает на уведомлении . После этого я сделаю еще одно действие.

Как я могу это сделать? И могу ли я сделать это на всех Windows платформах (от Windows 7 до Windows 10)?

1 Ответ

1 голос
/ 01 февраля 2020

Вы сказали в комментариях, что используете Shell_NotifyIcon() для отображения всплывающей подсказки. Ответ на ваш вопрос содержится в документации :

Начиная с Windows XP ( Shell32.dll версия 6.0 ), если пользователь передает указатель мыши поверх значка, с которым связано всплывающее уведомление, оболочка отправляет следующие сообщения:

  • NIN_BALLOONSHOW. Отправляется, когда отображается воздушный шар (воздушные шары в очереди).

  • NIN_BALLOONHIDE. Отправляется, когда воздушный шар исчезает. Например, когда значок удален. Это сообщение не отправляется, если всплывающее окно отклонено из-за тайм-аута или если пользователь щелкнет мышью.

  • Начиная с Windows 7, NIN_BALLOONHIDE также отправляется, когда уведомление с * 1021 Флаг * NIIF_RESPECT_QUIET_TIME пытается отобразить в тихое время (первый час работы пользователя на новом компьютере). В этом случае всплывающее окно вообще не отображается.

  • NIN_BALLOONTIMEOUT. Отправляется, когда шарик отклонен из-за тайм-аута.

  • NIN_BALLOONUSERCLICK. Отправляется, когда всплывающее окно отклоняется из-за того, что пользователь щелкнул мышью.

В дополнение к этим сообщениям, начиная с Windows Vista (Shell32.dll версия 6.0.6), если пользователь передает указатель мыши на значок, с которым связано всплывающее уведомление, оболочка Windows Vista также добавляет следующие сообщения:

  • NIN_POPUPOPEN. Отправляется, когда пользователь наводит курсор на значок, чтобы указать, что вместо стандартной текстовой всплывающей подсказки следует использовать более насыщенный всплывающий интерфейс.

  • NIN_POPUPCLOSE. Отправляется, когда курсор больше не находится над значком, указывающим, что всплывающий пользовательский интерфейс должен быть закрыт.

Независимо от версии операционной системы, вы можете выбрать, как должен вести себя Shell, вызвав Shell_NotifyIcon с dwMessage , установленным на NIM_SETVERSION. Установите uVersion член структуры NOTIFYICONDATA, на который указывает lpdata , чтобы указать, хотите ли вы, чтобы Windows 2000, Windows Vista или более ранняя версия 5.0 (Windows 95) поведение .

Примечание. Обсуждаемые выше сообщения не являются обычными Windows сообщениями. Они отправляются как значение lParam определенного приложением сообщения, указанного в элементе uCallbackMessage структуры NOTIFYICONDATA, на который указывает lpdata , когда Shell_NotifyIcon вызывается с помощью флаг NIM_ADD установлен в dwMessage .

Итак, для получения этих сообщений вам необходимо указать идентификатор сообщения HWND и Callback в NOTIFYICONDATA struct при вызове Shell_NotifyIcon() с dwMessage, установленным на NIM_ADD или NIM_MODIFY:

hWnd
Тип: HWND
A дескриптор окна, которое получает уведомления, связанные со значком в области уведомлений .

...

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.

...

Если вы установите флаг NIF_INFO в элементе uFlags, используется уведомление в виде всплывающего окна. Подробнее об этих уведомлениях см. всплывающие подсказки .

Итак, чтобы ответить на ваш вопрос, в WndPro c для HWND, который вы указали в В поле NOTIFYICONDATA::hWnd вы будете искать идентификатор сообщения, указанный в поле NOTIFYICONDATA::uCallbackMessage, а затем искать уведомление NIN_BALLOONUSERCLICK в значении lParam или LOWORD(lParam) сообщения, в зависимости от того, как вы установили NOTIFYICONDATA::uVersion поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...