Нужна помощь с хуком

Раздел посвящен программированию с использованием Power Basic.
Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Нужна помощь с хуком

Сообщение Lapex » 24.11.2008 (Пн) 12:07

Всем привет!

Пожалуйста помогите разобраться...

Пишу к приложению плагин (dll), мне необходимо узнать handle окна которое создается приложением и перехватить сообщение закрытия этого окна.

У окна известен заголовок "Project" (я не уверен, что разработчики приложения в дальнейшем его не изменят) и имя класса "Afx:400000:3:0:6:......" у которого при каждом запуске окна меняются последние 6 символов.

Предполагаю нужно сделать следующее:
В CASE %DLL_PROCESS_ATTACH содать таймер (не уверен, можно ли здесь запускать таймер), в которм ожидать появление окна с именем класса содержащего подстроку "Afx:400000:3:0:6:". Получить handle этого окна, запустить hook для отслеживания сообщений окна и остановить таймер.

Поправьте меня, если мое предположение ошибочно, а также у меня большая просьба, если не трудно помочь примером установки хука на сообщения указанного окна. Буду очень благодарен.

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Re: Нужна помощь с хуком

Сообщение Lapex » 26.11.2008 (Ср) 20:36

Набросал код, но к сожалению он получился не рабочим. :(
Не отлавливает создание нужного окна и иногда выдает ошибку чтения из памяти.
Код: Выделить всё
#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 cw AS CBT_CREATEWND PTR, cst AS CREATESTRUCT PTR
    LOCAL pClassName AS ASCIIZ PTR

    IF nCode = %HCBT_CREATEWND THEN
        cw = lParam     ' Get pointer to CBT_CREATEWND struct so we can...
        cst = @cw.lpcs  ' get a pointer to the CREATESTRUCT struct
        pClassName = @cst.lpszClass

        IF LEFT$(@pClassName,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

Пожалуйста подскажите, где я ошибся.


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

    TopList