Да, при обратном вызове WH_CBT
вы будете получать nCode HCBT_CREATEWND
при каждом создании окна меню.Проверка на имя класса, стандартные окна меню / подменю будут иметь имя класса «# 32768».Затем вы можете отправить в окно сообщение MN_GETHMENU
, чтобы узнать, какое меню должно быть активировано.Но , как задокументировано , слишком рано перемещать окно при получении уведомления, меню еще даже не видно, поэтому вам может потребоваться создать подкласс окна и обработать дополнительные сообщения.
Обратите внимание, что вам не нужно ловить, чтобы получать уведомления при отображении окна меню, вы можете поместить обработчик для сообщения WM_ENTERIDLE
, проверьте для wParam, чтобы увидеть, еслиВызвав сообщение, получите окно меню из 'lParam' и снова отправьте 'MN_GETHMENU', чтобы узнать конкретное меню.На этом этапе можно перемещать окно без дальнейшей обработки сообщений.Просто имейте в виду, что WM_ENTERIDLE будет вызываться несколько раз, поэтому вам нужно следить за тем, что вы уже переместили конкретное окно или нет.