Страница: 1 | 2 | 3 |
|
Вопрос: Нужна помощь с хуком
|
Добавлено: 25.11.08 15:46
|
|
Автор вопроса: Lapex
|
Всем привет!
Пожалуйста помогите разобраться...
Пишу к приложению плагин (dll), мне необходимо узнать handle окна которое создается приложением и перехватить сообщение закрытия этого окна.
У окна известен заголовок "Project" (я не уверен, что разработчики приложения в дальнейшем его не изменят) и имя класса "Afx:400000:3:0:6:......" у которого при каждом запуске окна меняются последние 6 символов.
Предполагаю нужно сделать следующее:
В CASE %DLL_PROCESS_ATTACH содать таймер (не уверен, можно ли здесь запускать таймер), в которм ожидать появление окна с именем класса содержащего подстроку "Afx:400000:3:0:6:". Получить handle этого окна, запустить hook для отслеживания сообщений окна и остановить таймер.
Поправьте меня, если мое предположение ошибочно, а также у меня большая просьба, если не трудно помочь примером установки хука на сообщения указанного окна. Буду очень благодарен.
Ответить
|
Номер ответа: 2 Автор ответа: Lapex
Вопросов: 6 Ответов: 56
|
Профиль | | #2
|
Добавлено: 25.11.08 21:48
|
Вообщем отлавить окно с помощью HCBT_CREATWND не удалось, пока поймал его с помощью HCBT_ACTIVATE. Ниже набросал код, который отлавливает сообщение окна WM_CLOSE, но программа с этим кодом глючит. При сворачивании окна приложение - приложение закрывается .
Пожалуйста подскажите, что не так с кодом.
-
- #COMPILE DLL
- #INCLUDE "Win32API.inc"
-
- GLOBAL hHook AS LONG
- GLOBAL hWnd AS DWORD
- GLOBAL pWndProc AS LONG
- GLOBAL ghInstance AS DWORD
-
- FUNCTION LIBMAIN (BYVAL hInstance AS LONG, _
- BYVAL fwdReason AS LONG, _
- BYVAL lpvReserved AS LONG) AS LONG
-
- SELECT CASE fwdReason
- CASE %DLL_PROCESS_ATTACH
- ghInstance = hInstance
- CALL SetHook()
- FUNCTION = 1
- CASE %DLL_PROCESS_DETACH
- UnhookWindowsHookEx hHook
- FUNCTION = 1
- CASE %DLL_THREAD_ATTACH
- FUNCTION = 1
- CASE %DLL_THREAD_DETACH
- FUNCTION = 1
- END SELECT
- END FUNCTION
-
- FUNCTION SetHook ALIAS "SetHook" () EXPORT AS LONG
- hHook = SetWindowsHookEx (%WH_CBT, CODEPTR(HookProc), BYVAL ghInstance, BYVAL GetCurrentThreadId)
- END FUNCTION
-
- CALLBACK FUNCTION WndProc
- SELECT CASE CBMSG
- CASE %WM_CLOSE
- MSGBOX "Exit"
- END SELECT
- FUNCTION = CallWindowProc(pWndProc, CBHNDL, CBMSG, CBWPARAM, CBLPARAM)
- END FUNCTION
-
- FUNCTION HookProc ( BYVAL nCode AS LONG, _
- BYVAL wParam AS LONG, _
- BYVAL lParam AS LONG) EXPORT AS LONG
-
- LOCAL ClassName AS ASCIIZ * %MAX_PATH
- IF nCode = %HCBT_ACTIVATE THEN
- GetClassName wParam, ClassName, SIZEOF(ClassName): _
- IF LEFT$(ClassName,17) = "Afx:400000:3:0:6:" THEN hWnd = wParam
- IF hWnd <> 0 THEN
- pWndProc = SetWindowLong (hWnd, %GWL_WNDPROC, CODEPTR(WndProc))
- END IF
- END IF
- END FUNCTION
Ответить
|
Номер ответа: 4 Автор ответа: Lapex
Вопросов: 6 Ответов: 56
|
Профиль | | #4
|
Добавлено: 26.11.08 10:28
|
в LPARAM передается адрес структуры CBT_CREATEWND, первое поле которой является адресом структуры CREATESTRUCT, в ней есть поле lpszClass - указатель на строку класса окна
Спасибо за совет, но у меня ничего не вышло - выдает ошибку (Period not allowed) в строке с CREATESTRUCT.lpszClass.
-
- FUNCTION HookProc ( BYVAL nCode AS LONG, _
- BYVAL wParam AS LONG, _
- BYVAL lParam AS LONG) EXPORT AS LONG
-
- LOCAL ClassName AS ASCIIZ * %MAX_PATH
- IF nCode = %HCBT_CREATEWND THEN
- CREATESTRUCT = CODEPTR(lParam)
- IF LEFT$(CREATESTRUCT.lpszClass,17) = "Afx:400000:3:0:6:" THEN hWnd = wParam
- IF hWnd <> 0 THEN
- pWndProc = SetWindowLong (hWnd, %GWL_WNDPROC, CODEPTR(WndProc))
- END IF
- END IF
- END FUNCTION
Пожалуйста, если не трудно - покажи, как добыть имя класса из LPARAM.
Ответить
|
Номер ответа: 6 Автор ответа: Father
Вопросов: 0 Ответов: 159
|
Профиль | | #6
|
Добавлено: 27.11.08 11:30
|
-
- HHOOK hhook;
- HWND hWnd;
-
- LRESULT CALLBACK CBTProc( int nCode, WPARAM wParam, LPARAM lParam )
- {
- if (nCode < 0) return CallNextHookEx(hhook, nCode, wParam, lParam);
- switch (nCode)
- {
- case HCBT_CREATEWND:
- if (hWnd) break; // НЕ ЗАБЫВАЙ !!
- hWnd = (HWND) wParam;
- CBT_CREATEWND* cw;
- CREATESTRUCT* cst;
- cw = (CBT_CREATEWND*) lParam;
- cst = (CREATESTRUCT*) cw->lpcs;
- MessageBox(0, cst->lpszName, 0, 0);
- //SetWindowLong(...
- break;
- default:
- break;
- }
- return CallNextHookEx(hhook, nCode, wParam, lParam);
- }
- //...
Вот у тебя есть такое:
IF hWnd <> 0 THEN
pWndProc = SetWindowLong (hWnd, %GWL_WNDPROC, CODEPTR(WndProc))
END IF
Это что же, опять повторный вызов? Не хорошо...
Ответить
|
Номер ответа: 7 Автор ответа: Lapex
Вопросов: 6 Ответов: 56
|
Профиль | | #7
|
Добавлено: 27.11.08 12:39
|
Это что же, опять повторный вызов? Не хорошо...
Мда, ступил
К сожалению Си я не знаю, но думаю, что выглядеть должно так:
-
- FUNCTION HookProc ( BYVAL nCode AS LONG, _
- BYVAL wParam AS LONG, _
- BYVAL lParam AS LONG) EXPORT AS LONG
-
- LOCAL cw AS CBT_CREATEWND PTR, cst AS CREATESTRUCT PTR
- LOCAL pClassName AS ASCIIZ PTR
-
- IF nCode = %HCBT_CREATEWND THEN
- IF hWnd = 0 THEN
- cw = lParam
- cst = @cw.lpcs
- pClassName = @cst.lpszClass
-
- IF LEFT$(@pClassName,17) = "Afx:400000:3:0:6:" THEN
- hWnd = wParam
- pWndProc = SetWindowLong (hWnd, %GWL_WNDPROC, CODEPTR(WndProc))
- END IF
- END IF
- END IF
- FUNCTION = CallNextHookEx(hHook, nCode, wParam, lParam)
- END FUNCTION
Ситуация не изменилась .
Ответить
|
Страница: 1 | 2 | 3 |
Поиск по форуму