Страницы

Поиск по вопросам

понедельник, 11 февраля 2019 г.

Обработка нажатия по пункту контекстного меню - WinAPI

Создал приложение, свернул в панель задач. Создал контекстное меню из одного пункта, оно успешно вызывается по ПКМ. Теперь, хотелось бы обработать нажатие по пункту меню. Вот код, но он не срабатывает:
case TREY_MESSAGE: // своя константа { switch (lParam) { case WM_RBUTTONUP: { // Извлекаю координаты курсора мыши GetCursorPos(&pt); // т.к. координаты не передаются в функцию, берём напрямую // Отображаем меню TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL);
return 0; } case WM_LBUTTONUP: { // щёлчек левой кнопкой мышки
return 0; } case WM_COMMAND: { // отладчик здесь не останавливается MessageBoxA(hwnd, "test", "test", MB_OK); if (LOWORD(wParam) == MENU_EXIT) // MENU_EXIT - идентификатор пункта меню PostMessage(hwnd, WM_CLOSE, lParam, wParam); return 0; } default: return 0; } }
Блоки WM_RBUTTONUP, WM_LBUTTONUP(этот для теста) обрабатываются, а вот в WM_COMMAND упорно не заходит. Как лечить?


Ответ

Вы ищете сообщение WM_COMMAND не там, куда операционная система может его отправить. WM_COMMAND — это полноценное сообщение, код которого хранится в параметре Msg. Вы же пытаетесь работать с ним как с кодом, пересылаемым в рамках TREY_MESSAGE, ища его в lParam (подобно кодам уведомлений в WM_NOTIFY). WM_COMMAND проверяется внутри case-ветки, работающей с TREY_MESSAGE, хотя это равноправные сообщения.

Комментариев нет:

Отправить комментарий