Страницы

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

понедельник, 6 января 2020 г.

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

#c #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
упорно не заходит. Как лечить?
    


Ответы

Ответ 1



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

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

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