Стоит задача: при клике мышью на элемент интерфейса получить ассоциированный текст. Получаю текст через IAccessible. Криво,конечно - далеко не все контролы его поддерживают, но как-то работает. Меню никак не поддерживаются. А надо. Хук на мышь ничего не даст. Вопрос: есть ли возможность получать текст выбранного пункта меню? Какая? Вопрос: нет ли элегантного способа,который позволил бы махом решить эти задачи?
Весьма любопытно. Как я понимаю, этот путь нужно использовать внутри процедуры хука мыши,предварительно определив тип окна. Т.е. внутри хук процедуры мы по hwnd делаем GetWindowLong, затем в случае меню выполняем MenuItemFromPoint. Эт понятно. Отлично. Спасибо! Долгий поиск вариантов заставляет упускать из виду самый легкий и очевидный )
Наблюдается небольшая трудность - по идее у нас есть хэндл меню, а не HMENU.А функция требует HMENU. Как его-то найти? GetMenu предназначена не для этого случая.
Вот пример моего хука. Он взаимодействует посредством зарегистрированного сообщения и mappped file с клиентской частью. Я вырезал из него все,что не относится к ловле меню.Схема взаимодействует работает нормально. Два вопроса: меню не ловится.Делать MapWindowPoints думаю, смысла нет. Что не так? Второй вопрос: Когда я тестирую нажатия в родном меню программы (т.е. не стороннем),PostMessage генерирует бесконечные MouseProc.Весьма странное поведение. LRESULT CALLBACK MouseProc(int Code, WPARAM wParam, LPARAM lParam) { MOUSEHOOKSTRUCT* mouse = (MOUSEHOOKSTRUCT*) lParam; if ((Code < 0) || (wParam!=WM_LBUTTONDOWN)) return CallNextHookEx(CommonArea->HookHandle, Code, wParam, lParam); { if (MenuItemFromPoint(0,(HMENU)mouse->hwnd,mouse->pt)!=-1){MessageBeep(MB _OK);strcpy(CommonArea->Text,"MENU found!");} PostMessage(CommonArea->FormHandle, WMMouseHook,0,0 ); } return CallNextHookEx(CommonArea->HookHandle, Code, wParam, lParam ); }
Я в этих сишных каракулях ничего не понимаю Вот так получается текст итема, над которым находится мышь: Код (Text): LOCAL Point :POINT LOCAL Buffer[64] :BYTE invoke GetCursorPos,addr Point invoke MenuItemFromPoint,NULL,hMenu,Point.x,Point.y test eax,eax js @F mov ecx,eax invoke GetMenuString,hMenu,ecx,ADDR Buffer,260,MF_BYPOSITION PrintString Buffer @@: Если есть правильный hMenu, то строка копируется в Buffer. Главное получить этот хэндл правильно
Дык с получением-то hMenu и проблема: MouseProc получает в MOUSEHOOKSTRUCT хэндл окна, а не меню. поэтому (HMENU)mouse->hwnd не имеет смысла.
q_q Ну ты поймал меня )) Набирал прямо в броузере, но тем не менее это вполне рабочий код. Естественно, пока длина строки не превысит 64 байта S_T_A_S_ Может тогда надо хук не на мышиные сообщения, а на оконные, и среди них может найдется такое, из которого можно извлечь хэндл. Например WM_MENUCOMMAND: LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window WM_MENUCOMMAND, // message to send WPARAM wParam, // item index LPARAM lParam // handle to menu (HMENU) The WM_MENUCOMMAND message gives you a handle to the menu--so you can access the menu data in the MENUINFO structure—and also gives you the index of the selected item, which is typically what applications need.
Жаль. А что WM_MENUSELECT? Написано when the user selects a menu item. Только когда кликнули итем? Или MF_HILITE в hiword wParam'a поможет отловить момент прохождения мыши?
так что там с hMenu в итоге получилось? Я имею ввиду - можно его как то получить руководствуясь только координатами курсора мыши?
2 cresta и др. Так получилось за прошедшие 2.5 года оседлать menu-info-from-point ? (Только чтоб не клик, а наведение курсора.) А то, не найдя (к своему удивлению) этого в инете, сейчас сам набрасываю MenuSpy, - а у вас, может, пылится готовенький ?
[Еще 2 года спустя] Поскольку мой халявный сайт вот-вот прикроют, выкладываю оттуда сюда кое-какие наброски по теме топика. До конца их не довел и забросил, однако они - рабочие, и если кого тема "MenuSpy" заинтересует - все-таки будет от чего отталкиваться. А если выйдет что дельное - уж не забудьте выложить сюда! ExtantMenu - просмотрщик всех текущих hMenu в системе (см. Help.txt). MenuSpy - то самое (только неприлично сырое), что и обсуждалось в топике. Кстати, пару лет назад поискал, но что-то не нашел в инете такого рода тулзы, как ни странно. Может, кому попадалось что-то в этом роде?