Нужно получить хэндл popup menu системного трея с целью добавить пункт. GetMenu по hWnd не проходит. Возможно создаётся динамически по WM_RBUTTONUP. Пробовал искать в реестре строки с пунктами меню - не нашёл. Что можно придумать?
Строки с пунктами находятся в ресурсах explorer.exe Первое что пришло на ум - это вписать пункт туда, и повесить хук на процедуру обработки сообщений от меню ...хм, глупость, наверное =))) Тут, кстати, где-то обсуждалась тема подмены ресурсов "на лету"
BeginUpdateResource возвращает ноль: файл explorer.exe запущен и редактироваться не может. IceStudent В Shell Programming нашёл добавление только новой панели (к таскбару), в меню появляется новый пункт, но он открывает назначенную бару папку, это немного не то: бар нафиг не нужен Может попробовать убить процесс explorer? После поменять ресурс и перезапустить? Не будет винда ругаться на подмену файлов неизвестными версиями?
cresta Конечно не будет. Она просто востановит explorer.exe Проблема чтоли попробовать? Засунь проводник в hiew а потом убей процес, измени хоть один байт, F9 и запусти процес снова. Теперь полюбуйся в Hiew на результат.
Восстановит, если в dllcache останется прежний. Поменял оба explorer.exe - не восстанавливает. Правда спрашивает, что делать с неизвестной версией: оставить или заменить на оригинальную. Можно оставить модифицированную, работает нормально. Вот только запрос не к месту Тут было "Окна каскадом" Посмотрел топик: кроме как перехватывать FindResource/LoadResource избавиться от этого запроса нельзя? Может воспользоваться как-то обстоятельством, что я сижу внутри процесса в с своей новой wndproc? IceStudent, спасибо, пойду смотреть.
IceStudent Нашёл на rsdn только контекстное меню проводника. Для трея не нашёл, может плохо искал Sl4v4 Например: взял двумя парентами выше той процедуры, где сидел в сабклассинге, и сделал ещё один сабклассинг, грандпаренту (слово-то какое тупое, и в новой оконной процедуре грандпарента поймал WM_INITMENU, а вместе с ним в wParam - hMenu, к которому добавил свой сепаратор и новый итем. И стал ловить WM_MENUSELECT, и младший ворд wParam'a, который равен ID выбранного итема, или 0, если итем не был выбран. Ну и в конце по WM_UNINITMENUPOPUP запоминание выбранного пункта. И всё. Мне кажется это достаточно простой и надёжный способ, без изменения меню в ресурсах и COM-заморочек.
cresta Вот тоже возникла необходимость добавить пункт в меню чужой программы, но что-то не получается ничего. Может покажешь пример, как это сделать?
код такой: Код (Text): NewParenProc proc uses ebx hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD LOCAL Pt :POINT LOCAL Rct :RECT mov eax, uMsg .if eax==WM_INITMENU invoke GetCursorPos, addr Pt invoke GetWindowRect, hTarget, addr Rct mov eax,Pt.x cmp eax,Rct.left jl @F push wParam pop hMenu invoke AppendMenu, hMenu, MF_SEPARATOR, 770, NULL invoke AppendMenu, hMenu, MF_STRING, 771, SADD("My Item") @@: .elseif eax==WM_MENUSELECT mov eax,wParam and eax,0FFFFh mov itemID,eax .elseif eax==WM_UNINITMENUPOPUP push itemID pop selectID .elseif eax==WM_EXITMENULOOP .if selectID==771 invoke DialogBoxParam,hInstance,101,NULL,addr DlgProc,NULL xor eax,eax ret .endif .endif invoke CallWindowProc, oldParentProc, hWin, uMsg, wParam, lParam ret NewParenProc endp это мой сабклассинг. Его пришлось делать т.к. меню создавалось динамически при RBUTTONUP и уничтожалось после выбора итема. Может тебе надо воспользоваться чем-то вроде GetMenu ? Это если меню создаётся один раз при запуске приложения.
В каком смысле? Не приходит в wndproc? Возьми spy++, посмотри какие сообщения приходят окну, может быть его паренту, при появлении меню. Может надо перехватить WM_RBUTTONUP.
Да нет, всё приходит. Дело в том что я пытаюсь отлавливать их хуком WH_GETMESSAGE, а вот в процедуру хука они не приходят, хотя все параметры перепроверил. Сейчас попробую твоим способом сделать.
Я использовал хук (WH_CALLWNDPROC) только чтобы попасть в пространство другой программы. По первому же вызову CallWndProc с интересующим меня hWnd грузил в пространство проги вторую dll с новой WndProc, а хук удалял. Далее всё во второй dll.
Всё же решил по своему, через WH_GETMESSAGE сделать, только вот в стеке заблудился. Может кто подскажет дорогу? Значит так, в процедуре хука делаем Код (Text): mov eax, [ebp+10h] lParam у нас теперь в eax, значит dword ptr [eax+4] указывает на параметр message структуры MSG. Всё чудесно, если сообщения нулевого уровня вложенности, например от клавиатуры или мышки. Но сообщение WM_INITMENU - шестого уровня (согласно показаниям Spy++), и явно находится не здесь. А вот где?