Получить текст из меню/контрола

Тема в разделе "WASM.WIN32", создана пользователем SomeOne_TT, 12 фев 2005.

  1. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    Стоит задача: при клике мышью на элемент интерфейса получить ассоциированный текст.

    Получаю текст через IAccessible. Криво,конечно - далеко не все контролы его поддерживают, но как-то работает.



    Меню никак не поддерживаются. А надо. Хук на мышь ничего не даст.

    Вопрос: есть ли возможность получать текст выбранного пункта меню? Какая?



    Вопрос: нет ли элегантного способа,который позволил бы махом решить эти задачи?
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    MenuItemFromPoint

    GetMenuString

    GetMenuItemInfo
     
  3. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    Весьма любопытно. Как я понимаю, этот путь нужно использовать внутри процедуры хука мыши,предварительно определив тип окна.

    Т.е. внутри хук процедуры мы по hwnd делаем GetWindowLong, затем в случае меню выполняем MenuItemFromPoint. Эт понятно. Отлично. Спасибо!



    Долгий поиск вариантов заставляет упускать из виду самый легкий и очевидный )
     
  4. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    Наблюдается небольшая трудность - по идее у нас есть хэндл меню, а не HMENU.А функция требует HMENU. Как его-то найти? GetMenu предназначена не для этого случая.
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    А что же по-твоему тогда HMENU ????
     
  6. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    Вот пример моего хука. Он взаимодействует посредством

    зарегистрированного сообщения и 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 );

    }
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Я в этих сишных каракулях ничего не понимаю :dntknw:



    Вот так получается текст итема, над которым находится мышь:
    Код (Text):
    1.     LOCAL Point        :POINT
    2.     LOCAL Buffer[64]   :BYTE
    3.  
    4.     invoke GetCursorPos,addr Point
    5.     invoke MenuItemFromPoint,NULL,hMenu,Point.x,Point.y
    6.     test eax,eax
    7.     js @F
    8.         mov ecx,eax
    9.         invoke GetMenuString,hMenu,ecx,ADDR Buffer,260,MF_BYPOSITION
    10.         PrintString Buffer    
    11.     @@:




    Если есть правильный hMenu, то строка копируется в Buffer.

    Главное получить этот хэндл правильно
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    cresta

    Buffer[64]:BYTE ... ADDR Buffer,260

    Ну-ну.
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Дык с получением-то hMenu и проблема: MouseProc получает в MOUSEHOOKSTRUCT хэндл окна, а не меню.

    поэтому (HMENU)mouse->hwnd не имеет смысла.
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    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.
     
  11. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754




    :-(
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Жаль. А что WM_MENUSELECT? Написано when the user selects a menu item. Только когда кликнули итем? Или MF_HILITE в hiword wParam'a поможет отловить момент прохождения мыши?
     
  13. Broken Sword

    Broken Sword Robert

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    433
    так что там с hMenu в итоге получилось? Я имею ввиду - можно его как то получить руководствуясь только координатами курсора мыши?
     
  14. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    2 cresta и др.

    Так получилось за прошедшие 2.5 года оседлать menu-info-from-point ? (Только чтоб не клик, а наведение курсора.)

    А то, не найдя (к своему удивлению) этого в инете, сейчас сам набрасываю MenuSpy, - а у вас, может, пылится готовенький ?
     
  15. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    [Еще 2 года спустя]

    Поскольку мой халявный сайт вот-вот прикроют, выкладываю оттуда сюда кое-какие наброски по теме топика.
    До конца их не довел и забросил, однако они - рабочие, и если кого тема "MenuSpy" заинтересует - все-таки будет от чего отталкиваться.
    А если выйдет что дельное - уж не забудьте выложить сюда!

    ExtantMenu - просмотрщик всех текущих hMenu в системе (см. Help.txt).
    MenuSpy - то самое (только неприлично сырое), что и обсуждалось в топике.

    Кстати, пару лет назад поискал, но что-то не нашел в инете такого рода тулзы, как ни странно. Может, кому попадалось что-то в этом роде?
     
  16. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
  17. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    На скриншоте - работающие в паре ExtantMenu (справа) и MenuSpy:

    [​IMG]
     
  18. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    На скриншоте - работающие в паре ExtantMenu (справа) и MenuSpy:

    [​IMG]
     
  19. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    А где сайт? Хотелось бы посмотреть.
     
  20. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва