Функция GetMenuBarInfo () win32 - PullRequest
       0

Функция GetMenuBarInfo () win32

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

Я хотел получить размеры выпадающего меню из строки меню. Согласно документации Microsoft , если я передам OBJID_CLIENT параметру idObject

BOOL GetMenuBarInfo(
  HWND         hwnd,
  LONG         idObject,
  LONG         idItem,
  PMENUBARINFO pmbi
);

, я смогу получить структуру MENUBARINFO

Всплывающее меню, связанное с окном.


Однако Я не верю, что есть всплывающее меню, связанное с окном . Вызов GetMenuBarInfo() с OBJID_CLIENT дает мне нули, вызов SetMenu() (в подменю в строке меню) дает мне код ошибки ERROR_INVALID_PARAMETER. TrackPopupMenu() - единственный документированный способ отображения всплывающих меню, но он блокируется.

Неправильно ли документация?

Ответы [ 3 ]

2 голосов
/ 24 февраля 2020

В этом случае hWnd необходимо указать дескриптор окна строки меню, и всплывающее меню будет видимым.

Обычно используется в Windows Hook. пример:

HHOOK hhook;
LRESULT CALLBACK myHookProc(int code, WPARAM wParam, LPARAM lParam)
{
    CWPSTRUCT* lpcwps = (CWPSTRUCT*)lParam;
    BOOL ret = 0;
    if (code == HC_ACTION)
    {
        if (lpcwps->message == MN_GETHMENU)
        {
            MENUBARINFO minfo;
            minfo.cbSize = sizeof(MENUBARINFO);
            ret = GetMenuBarInfo(lpcwps->hwnd, OBJID_CLIENT, 0, &minfo);
            printf_rect(minfo.rcBar);
        }

    }
    return CallNextHookEx(hhook, code, wParam, lParam);
}

И

hhook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)myHookProc, hInstance, GetCurrentThreadId());

Это перехватит Winpro c класса системного меню L"#32768" и откроет окно меню, когда после всплывающего меню был видимым.

2 голосов
/ 26 февраля 2020
case WM_MENUSELECT:
    {
        HWND myhWnd = FindWindowW(L"#32768", nullptr);       
        GetMenuBarInfo(myhWnd, OBJID_CLIENT, 0, &info);
        printf_rect(info.rcBar);
    }

работает. Но я бы не знал, как получить имя класса системного меню без ответа Дрейка:

перехватывает Winpro c класса системного меню L"#32768".

2 голосов
/ 23 февраля 2020

TrackPopupMenu() не блокирует выполнение вашего кода. Внутри него есть сообщение l oop, это сообщение l oop обработано сообщения всплывающего меню и сообщения вашего окна.

Например, если ваше окно перекрашивается при отображении вызванного меню по TrackPopupMenu() вы можете найти это меню, используя GetMenuBarInfo из вашего обработчика WM_PAINT. То же самое с WM_TIMER или другими сообщениями, есть даже выделенное сообщение WM_ENTERMENULOOP.

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