Специфический(?) баг с хуком.
От: Аноним  
Дата: 03.12.04 11:57
Оценка:
В общем, задача — установить хук, чтобы перехватывать сообщения типа WM_INITMENU.
HWND окна, которое принимает эти сообщения — знаю.
ThreadID процесса, в котором все это происходит — знаю.

Подскажите, пожалуйста, что я неправильно делаю.
В DLL-ке устанавливаю хук:
hhookMsg = SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,hDLL,d);
Где
CallWndProc — процедура из этой же ДЛЛ-ки,(определяется правильно)
hDLL — HINSTANCE этой же ДЛЛ-ки (ставлю HINSTANCE, получаемый при входе в DllMain).
DWORD d — ThreadID процесса, который я хочу слушать (проверил таск-манагером — правильно).
при попытке установки такого хука вылетает ошибка
87 (The parameter is incorrect.) ERROR_INVALID_PARAMETER
При установке d=NULL (для прослушивания трэдов всех процессов) хук устанавливается, но в него приходят сообщения только от формы, которая аттачит ДЛЛ-ку.
Re: Специфический(?) баг с хуком.
От: rus blood Россия  
Дата: 03.12.04 12:00
Оценка:
Здравствуйте, Аноним, Вы писали:

Параметр thread id в функции SetWindowsHookEx предназначен для установки тредовых хуков, т.е. на потоки внутри твоего же процесса. В этом случае, функция должна быть внутри этого процесса, а handle dll-ки можно передать нулевой.

Для хуков на другие процессы это не работает.
Имею скафандр — готов путешествовать!
Re[2]: Специфический(?) баг с хуком.
От: Andrew S Россия http://alchemy-lab.com
Дата: 03.12.04 12:16
Оценка: +1
RB>Параметр thread id в функции SetWindowsHookEx предназначен для установки тредовых хуков, т.е. на потоки внутри твоего же процесса. В этом случае, функция должна быть внутри этого процесса, а handle dll-ки можно передать нулевой.

RB>Для хуков на другие процессы это не работает.


Ой, и правда?
Что то MSDN с этим не согласна:

[in] Pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link library (DLL). Otherwise, lpfn can point to a hook procedure in the code associated with the current process.

http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re: Специфический(?) баг с хуком.
От: Andrew S Россия http://alchemy-lab.com
Дата: 03.12.04 12:24
Оценка:
А>DWORD d — ThreadID процесса, который я хочу слушать (проверил таск-манагером — правильно).

Вообще то TaskManager показывает PID — ProcessID. Вам, как я понимаю, нужно устанавливать хук на определенный тред процесса (я бы назвал его гуи тредом). Тогда делаете так:

1. Находите окно процесса, которое вас собственно интересует. Например, при помощи FindWindow.
2. При помощи GetWindowThreadProcessId получаете Thread Id треда, создавшего это окно.
3. Ну, а далее вы знаете

Успехов.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[3]: Специфический(?) баг с хуком.
От: rus blood Россия  
Дата: 03.12.04 14:26
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Ой, и правда?


Ой, и точно!
Каюсь, наврал...
Имею скафандр — готов путешествовать!
Re[2]: Специфический(?) баг с хуком.
От: Аноним  
Дата: 03.12.04 16:13
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>Вообще то TaskManager показывает PID — ProcessID. Вам, как я понимаю, нужно устанавливать хук на определенный тред процесса (я бы назвал его гуи тредом). Тогда делаете так:


AS>1. Находите окно процесса, которое вас собственно интересует. Например, при помощи FindWindow.

AS>2. При помощи GetWindowThreadProcessId получаете Thread Id треда, создавшего это окно.
AS>3. Ну, а далее вы знаете
1. нашел
2. к сожалению GetWindowThreadProcessId возвращает мне не ThreadId треда, а ProcessId процесса, создавшего окно.

Проблема детальнее:
В приложении (не моем) меню сделано как ToolbarWindow32 с плоскими кнопками.
Мой GUI должен уметь шастать по этой "менюшке" и получать информацию о пунктах меню
(текст, активность и т.п.). Для этого, мне, естественно нужны HMENU этих PopupMenu.
Единственный способ, который я придумал — пытаться перехватить сообщения WM_INITMENU или
WM_INITMENUPOPUP, которые точно приходят тулбару(проверил с помощью Spy++).
Может есть еще какие-то варианты? Может попробовать подменить WindowProc как нить?
Re[3]: Специфический(?) баг с хуком.
От: Кодёнок  
Дата: 04.12.04 10:16
Оценка:
А>2. к сожалению GetWindowThreadProcessId возвращает мне не ThreadId треда, а ProcessId процесса, создавшего окно.

GetWindowThreadProcessId возвращает и тред и процесс одновременно. Тред через retval, процесс через указатель (out-параметр)
Re[4]: Специфический(?) баг с хуком.
От: FUriCK Украина  
Дата: 04.12.04 11:15
Оценка:
Здравствуйте, Кодёнок, Вы писали:

А>>2. к сожалению GetWindowThreadProcessId возвращает мне не ThreadId треда, а ProcessId процесса, создавшего окно.

Кё>GetWindowThreadProcessId возвращает и тред и процесс одновременно. Тред через retval, процесс через указатель (out-параметр)
Большое спасибо!
Недосмотрел в MSDN А еще и обратил внимание на то, что "если параметр не NULL, то в него копируется инфа, а если NULL — не копируется. Еще и подумал о том, зачем было это писать.
Еще раз огромное спасибо всем!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.