winapi - запретить закрытие контекстного меню - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть сценарий, где контекстное меню должно оставаться открытым. Я использовал хук WH_MSGFILTER для получения сообщений контекстного меню. Когда пользователь нажимает на элемент контекстного меню, открывается диалоговое окно для выбора цвета:

case WM_LBUTTONUP:
{
    if (colorSelected)
    {   
        //pMSG->message = WM_NULL; doesn't prevent context menu from closing when a dialog box is opened below
        currentColor = chooseColor(selectedMenuItemPos); //call ChooseColor winapi 
    }
    break;
}

Здесь - пример того, как запретить закрытие контекстного меню, когда пользователь нажимает на пункт контекстного меню. Как вы можете видеть из приведенного выше кода, я также попробовал этот метод, но он не работает, когда открывается диалоговое окно. Можно ли при таком сценарии держать открытым контекстное меню? Здесь - аналогичный вопрос, но его можно решить, используя метод, описанный выше. Меня не интересует другое решение, например, фальшивое окно меню. Мне просто любопытно, технически возможно ли это в winapi.

1 Ответ

1 голос
/ 13 апреля 2020

WH_CBT крюк может препятствовать закрытию меню при обработке HCBT_DESTROYWND.

Зарегистрировать крюк: SetWindowsHookEx(WH_CBT, CBTProc, NULL, GetCurrentThreadId());

Крюк процедура:

HRESULT CALLBACK CBTProc(
    int nCode, WPARAM wParam, LPARAM lParam
)
{
    switch (nCode)
    {
    case HCBT_DESTROYWND:
    {
        if((HWND)wParam == gMenuWindowHandle)
        {
            return 1; // Return 1 to prevents closing window.
        }
    }
    break;
    }

    return ::CallNextHookEx(NULL, nCode, wParam, lParam);
}

Результат (About - это элемент меню, а About WindowsProject21 - это диалоговое окно):

enter image description here

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