Создал приложение, свернул в панель задач. Создал контекстное меню из одного пункта, оно успешно вызывается по ПКМ. Теперь, хотелось бы обработать нажатие по пункту меню. Вот код, но он не срабатывает:
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, хотя это равноправные сообщения.
Комментариев нет:
Отправить комментарий