Вопрос по win hooks (24 урок)

Тема в разделе "WASM.BEGINNERS", создана пользователем verelex, 27 ноя 2006.

  1. verelex

    verelex New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    90
    Процедура на перхват сообщений (в DLL, системный хук):
    Код (Text):
    1. kp proc nCode:DWORD,wParam:DWORD,lParam:DWORD ; KeyboardProc
    2.     invoke CallNextHookEx,hHook,nCode,wParam,lParam
    3.     invoke MessageBox,NULL,addr szError,ADDR szError,MB_OK
    4.     ret
    5. kp endp
    При нажатии на кнопки выдает 2 сообщения. Всё правильно: на WM_KEYDOWN и WM_KEYUP.
    Далее делаем:
    Код (Text):
    1. kp proc nCode:DWORD,wParam:DWORD,lParam:DWORD ; KeyboardProc
    2.     invoke CallNextHookEx,hHook,nCode,wParam,lParam
    3.     .if nCode==WM_KEYUP
    4.     invoke MessageBox,NULL,addr szError,ADDR szError,MB_OK
    5.     .endif
    6.     ret
    7. kp endp
    По идее должно быть одно сообщение, но MessageBox'ов не наблюдается ни одного! В чем ошибка?
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    На сколько помню этот параметр передаётся не в nCode. Лучше выведи все параметры, и посмотри что приходит при нажатии.
     
  3. verelex

    verelex New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    90
    Опытным путем получено:
    nCode=0 всегда,
    wParam=код клавиши,
    lParam: при KEYDOWN=7-значному числу(напр. 230001), а при KEYUP:
    lParam = (lParam при KEYDOWN)+0c0000000h (0c0230001h)
    Условие:
    Код (Text):
    1. .if lParam > 0c0000000
    2. ; это KEYUP
    3. .endif
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Хм. А в MSDN религия не позволяет заглянуть?
    Код (Text):
    1. lParam
    2. [in] Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag. For more information about the lParam parameter, see Keystroke Message Flags. This parameter can be one or more of the following values.
    3. ...
    4. 30
    5. Specifies the previous key state. The value is 1 if the key is down before the message is sent; it is 0 if the key is up.
    6. ...
     
  5. verelex

    verelex New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    90
    A так получается 2 msgbox'a:
    Код (Text):
    1.         test  lParam,20000000h
    2.         jnz  mmm1
    3.         invoke MessageBox,NULL,addr buffer1,ADDR szAppName,MB_OK
    4. mmm1:   nop
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    А почему идёт сравнение с 20000000h?
    Надо с 40000000h.
    Нумерация битов идёт с нуля.
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    verelex
    Напиши test [lParam],1 shl 30 чтоб не путаться.
     
  8. verelex

    verelex New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    90
    Спасибо!