Найти хэндл меню

Тема в разделе "WASM.WIN32", создана пользователем cresta, 8 дек 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Нужно получить хэндл popup menu системного трея с целью добавить пункт. GetMenu по hWnd не проходит. Возможно создаётся динамически по WM_RBUTTONUP. Пробовал искать в реестре строки с пунктами меню - не нашёл.

    Что можно придумать?
     
  2. Sl4v4

    Sl4v4 New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    69
    Строки с пунктами находятся в ресурсах explorer.exe Первое что пришло на ум - это вписать пункт туда, и повесить хук на процедуру обработки сообщений от меню ...хм, глупость, наверное =)))



    Тут, кстати, где-то обсуждалась тема подмены ресурсов "на лету"
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Тебе дорога в Shell Programming (msdn).
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Спасибо, ресурс нашёл, попробую updateresource.
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    BeginUpdateResource возвращает ноль: файл explorer.exe запущен и редактироваться не может.



    IceStudent



    В Shell Programming нашёл добавление только новой панели (к таскбару), в меню появляется новый пункт, но он открывает назначенную бару папку, это немного не то: бар нафиг не нужен



    Может попробовать убить процесс explorer? После поменять ресурс и перезапустить? Не будет винда ругаться на подмену файлов неизвестными версиями?
     
  6. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    cresta





    Конечно не будет. Она просто востановит explorer.exe



    Проблема чтоли попробовать?

    Засунь проводник в hiew а потом убей процес, измени хоть один байт, F9 и запусти процес снова. Теперь полюбуйся в Hiew на результат.
     
  7. Sl4v4

    Sl4v4 New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    69
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Там не только добавление панели.
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Восстановит, если в dllcache останется прежний. Поменял оба explorer.exe - не восстанавливает. Правда спрашивает, что делать с неизвестной версией: оставить или заменить на оригинальную. Можно оставить модифицированную, работает нормально. Вот только запрос не к месту :dntknw:



    Тут было "Окна каскадом"

    [​IMG]



    Посмотрел топик: кроме как перехватывать FindResource/LoadResource избавиться от этого запроса нельзя? Может воспользоваться как-то обстоятельством, что я сижу внутри процесса в с своей новой wndproc?



    IceStudent, спасибо, пойду смотреть.
     
  10. Sl4v4

    Sl4v4 New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    69


    Я думаю перехватывать тут надо LoadMenu/GetSubMenu



    например?
     
  11. cresta

    cresta Active Member

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

    Нашёл на rsdn только контекстное меню проводника. Для трея не нашёл, может плохо искал :dntknw:



    Sl4v4





    Например: взял двумя парентами выше той процедуры, где сидел в сабклассинге, и сделал ещё один сабклассинг, грандпаренту (слово-то какое тупое:), и в новой оконной процедуре грандпарента поймал WM_INITMENU, а вместе с ним в wParam - hMenu, к которому добавил свой сепаратор и новый итем. И стал ловить WM_MENUSELECT, и младший ворд wParam'a, который равен ID выбранного итема, или 0, если итем не был выбран. Ну и в конце по WM_UNINITMENUPOPUP запоминание выбранного пункта.

    И всё.



    Мне кажется это достаточно простой и надёжный способ, без изменения меню в ресурсах и COM-заморочек.
     
  12. Sl4v4

    Sl4v4 New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    69
    Во как! И что мы тут столько мудрили =D
     
  13. Sl4v4

    Sl4v4 New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    69
    cresta

    Вот тоже возникла необходимость добавить пункт в меню чужой программы, но что-то не получается ничего. Может покажешь пример, как это сделать?
     
  14. cresta

    cresta Active Member

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


    Код (Text):
    1. NewParenProc proc  uses ebx hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    2.     LOCAL Pt        :POINT
    3.     LOCAL Rct       :RECT
    4.    
    5.     mov     eax, uMsg
    6.     .if     eax==WM_INITMENU
    7.         invoke  GetCursorPos, addr Pt
    8.         invoke  GetWindowRect, hTarget, addr Rct
    9.         mov     eax,Pt.x
    10.         cmp     eax,Rct.left
    11.         jl      @F
    12.         push    wParam
    13.         pop     hMenu
    14.         invoke  AppendMenu, hMenu, MF_SEPARATOR, 770, NULL
    15.         invoke  AppendMenu, hMenu, MF_STRING, 771, SADD("My Item")            
    16.         @@:
    17.                
    18.     .elseif eax==WM_MENUSELECT
    19.         mov     eax,wParam
    20.         and     eax,0FFFFh
    21.         mov     itemID,eax
    22.        
    23.     .elseif eax==WM_UNINITMENUPOPUP
    24.         push    itemID
    25.         pop     selectID
    26.        
    27.     .elseif eax==WM_EXITMENULOOP
    28.         .if     selectID==771
    29.             invoke  DialogBoxParam,hInstance,101,NULL,addr DlgProc,NULL
    30.             xor     eax,eax
    31.             ret
    32.         .endif
    33.  
    34.     .endif
    35.    
    36.     invoke  CallWindowProc, oldParentProc, hWin, uMsg, wParam, lParam
    37.     ret
    38.  
    39. NewParenProc endp




    это мой сабклассинг. Его пришлось делать т.к. меню создавалось динамически при RBUTTONUP и уничтожалось после выбора итема.

    Может тебе надо воспользоваться чем-то вроде GetMenu ? Это если меню создаётся один раз при запуске приложения.
     
  15. Sl4v4

    Sl4v4 New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    69
    Да да, именно динамически создаваемое меню. У меня проблемы с перехватом WM_INITMENU
     
  16. cresta

    cresta Active Member

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


    В каком смысле? Не приходит в wndproc?

    Возьми spy++, посмотри какие сообщения приходят окну, может быть его паренту, при появлении меню.

    Может надо перехватить WM_RBUTTONUP.
     
  17. Sl4v4

    Sl4v4 New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    69
    Да нет, всё приходит. Дело в том что я пытаюсь отлавливать их хуком WH_GETMESSAGE, а вот в процедуру хука они не приходят, хотя все параметры перепроверил. Сейчас попробую твоим способом сделать.
     
  18. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Я использовал хук (WH_CALLWNDPROC) только чтобы попасть в пространство другой программы. По первому же вызову CallWndProc с интересующим меня hWnd грузил в пространство проги вторую dll с новой WndProc, а хук удалял. Далее всё во второй dll.
     
  19. Sl4v4

    Sl4v4 New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    69
    Всё же решил по своему, через WH_GETMESSAGE сделать, только вот в стеке заблудился. Может кто подскажет дорогу? Значит так, в процедуре хука делаем
    Код (Text):
    1. mov  eax, [ebp+10h]
    lParam у нас теперь в eax, значит dword ptr [eax+4] указывает на параметр message структуры MSG. Всё чудесно, если сообщения нулевого уровня вложенности, например от клавиатуры или мышки. Но сообщение WM_INITMENU - шестого уровня (согласно показаниям Spy++), и явно находится не здесь. А вот где?
     
  20. Sl4v4

    Sl4v4 New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    69
    Все сделал путём подмены оконной функции. Вопрос исчерпан.