Оперативное слежение за меню требует, чтобы меню показывалось на экране всегда, кроме краткого интервала, требуемого для переключения на новое меню. Однако, раскрывающееся меню, которое показывается на экране функцией TrackPopupMenu, является модальным. Ваше приложение будет продолжать получать некоторые сообщения непосредственно, включая и сообщения WM_COMMAND, TBN_HOTITEMCHANGE и нормальные связанные с меню сообщения такие как WM_MENUSELECT. Однако, оно не будет получать сообщения низкого уровня от клавиатуры или от мыши непосредственно. Чтобы обрабатывать сообщения, такие как WM_MOUSEMOVE, Вы должны заставить фильтр (hook) - процедуру сообщений перехватывать сообщения, направленные для меню.
Когда раскрывающееся меню показывается на экране, установите фильтр (hook) - процедуру сообщений при помощи вызова функции SetWindowsHookEx с установкой параметра idHook в WH_MSGFILTER. Все сообщения предназначенные для меню должны быть переданы в вашу фильтр (hook) - процедуру. Например, нижеследующий фрагмент кода устанавливает фильтр (hook) - процедуру сообщений, которая будет перехватывать сообщения, идущие в раскрывающееся меню. MsgHook - это имя фильтр (hook) - процедуры, а hhookMsg - дескриптор процедуры.
hhookMsg = SetWindowsHookEx(WH_MSGFILTER, MsgHook, HINST_THISDLL, 0); |
Сообщения меню идентифицируются, установкой параметра nCode фильтр (hook) - процедуры в MSGF_MENU. Параметр lParam укажет на структуру MSG с сообщением. Детали того, какое и как сообщения должны быть обработаны, обсуждаются в оставшейся части этого документа.
Ваше приложение должно помещать в очередь все сообщения следующие на фильтр (hook) - процедуру сообщений при помощи вызова CallNextHookEx. Вы должны также отправлять вне очереди сообщения мыши непосредственно органу управления инструментальной панели, удостоверяясь, что любые координаты точек преобразуются в координаты рабочей области пространства инструментальной панели. Передача сообщений непосредственно гарантирует, что орган управления инструментальной панели получает соответствующие сообщения мыши. Например, инструментальная панель должна получить сообщения WM_MOUSEMOVE, для того, чтобы оперативно отслеживать его кнопки.
Когда новая кнопка активизирована, ваше приложение должно свернуть старое раскрывающееся меню с сообщением WM_CANCELMODE и показать на экране новое меню. Оно должно также свернуть раскрывающееся меню, когда фокус получен от строки меню при перемещении по меню с помощью клавиатуры, или при помощи щечка кнопкой мыши вне области меню. Всякий раз, когда Вы свертываете меню, Вы должны освободить его фильтр (hook) - процедуру сообщения при помощи функции UnhookWindowsHookEx. Если Вы должны показать на экране другое раскрывающееся меню, создайте новую фильтр (hook) - процедуру сообщений. Когда команда запускается, меню будет свертываться автоматически, но Вы должны явно освободить фильтр (hook) - процедуру сообщений.
Нижеследующий фрагмент кода освобождает фильтр (hook) - процедуру сообщений, которая устанавливалась в предыдущем примере.
UnhookWindowsHookEx(hhookMsg); |