Параметр так же обозначает окно, в которое будут поступать сообщения.

ли способ изменить положение всплывающего меню. С окнами верхнего уровня я могу сделать это с помощью функции обратного вызова CBTProc и MoveWindow. Могу ли я сделать то же самое с меню? Необходимо сделать так, чтобы всплывающее меню находилось только в области его родительского окна. Что-то вроде легкого оконного менеджера.

Ответы на вопрос(1)

Решение Вопроса

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

Обратите внимание, что вам не нужно ловить, чтобы получать уведомления при отображении окна меню, вы можете поместить обработчик дляWM_ENTERIDLE сообщение, проверьте «wParam», чтобы увидеть, вызвало ли меню сообщение, получить окно меню из «lParam» и снова отправить «MN_GETHMENU», чтобы узнать конкретное меню. На этом этапе можно перемещать окно без дальнейшей обработки сообщений. Просто имейте в виду, что WM_ENTERIDLE будет вызываться несколько раз, поэтому вам нужно следить за тем, что вы уже переместили конкретное окно или нет.

 Alexander21 янв. 2011 г., 18:37
Спасибо большое, это то что мне нужно! Сейчас я пытаюсь сделать то же самое с контекстным меню, но не могу найти подходящее окно сообщения, чтобы поймать его. Можете мне что-нибудь посоветовать?
 Sertac Akyuz21 янв. 2011 г., 19:29
@Alexander - протестировано с приложением Delphi, оба метода работают. Обязательно передайте ручку вашего окнаTrackPopupMenu[ex] дляhwnd Параметр так же обозначает окно, в которое будут поступать сообщения.

Ваш ответ на вопрос