Проблема с хуком =(

Тема в разделе "WASM.BEGINNERS", создана пользователем BuchoyJonn, 11 окт 2010.

  1. BuchoyJonn

    BuchoyJonn New Member

    Публикаций:
    0
    Регистрация:
    30 сен 2010
    Сообщения:
    2
    Здравствуйте люди добрые !
    Вообще-то я пишу на С++ , но тут что-то захотел попробовать на asm, решить вот такую задачку...
    Мне нужно отслеживать нажатия клавиш WIN или VK_LMENU И VK_RMENU как они определены у меня в Windows.inc.
    Решил поставить хук "по клаве" если так можно выразиться.
    Решил в качестве базы взять соответствующий урок Экзельциона, хук процедуру вынес в DLL,
    хук процедура которой и должна была отслеживать нажатия соответствующей клавиши. Когда пользователь нажимает
    клавишу WIN выбрасывается MessageBox с текстом "Клавиша WIN нажата" если нажата и наоборот если не нажата.
    вот собственно код :

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. include \masm32\include\windows.inc
    5. include \masm32\include\kernel32.inc
    6. includelib \masm32\lib\kernel32.lib
    7. include \masm32\include\user32.inc
    8. includelib \masm32\lib\user32.lib
    9.  
    10. .data
    11. hInstance dd 0
    12. Text db "Нажата клавиша WIN ...",0
    13. HelloMsg db "Это KeyBrdHook.dll",0
    14. Text1 db "Клавиша WIN отпущена ...",0
    15. HelloMsg1 db "Это KeyBrdHook.dll",0
    16.  
    17. .data?
    18. hHook dd ?
    19.  
    20. .code
    21. DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD
    22.     push hInst
    23.     pop hInstance
    24.   mov  eax,TRUE
    25.   ret
    26. DllEntry Endp
    27.  
    28. KeyProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD
    29.     invoke CallNextHookEx,hHook,nCode,wParam,lParam
    30.     mov edx,lParam
    31.    
    32.      invoke GetKeyState, wParam
    33.    .if eax==1
    34.    invoke MessageBox, NULL, addr Text, addr HelloMsg, MB_OK
    35.    .else
    36.    invoke MessageBox, NULL, addr Text1, addr HelloMsg1, MB_OK
    37.    .endif
    38.    
    39.     xor eax,eax
    40.     ret
    41. MouseProc endp
    42.  
    43. InstallHook proc
    44.     invoke SetWindowsHookEx,WH_KEYBOARD,addr KeyProc,hInstance,NULL
    45.     mov hHook,eax
    46.     ret
    47. InstallHook endp
    48.  
    49. UninstallHook proc
    50.     invoke UnhookWindowsHookEx,hHook
    51.     ret
    52. UninstallHook endp
    53.  
    54. End DllEntry
    А беда в том что сообщения вызываются для всех кнопок а мне нужно чтобы только для WIN ну хотя бы для одной например.
    В чем и где я неправ ?
    Пожалуста если не трудно привидите код рабочий, буду весьма признателен =)

    И еще есть вот такой косяк :
    при объявлении функции

    Код (Text):
    1. wsprintfA PROTO C :DWORD,:VARARG
    2. wsprintf equ <wsprintfA>
    компилятор ругается =(

    Код (Text):
    1. error A2111: conflicting parameter definition
    2. fatal error A1016: Internal Assembler Error
    а эта функция мне нужна, что делать ?
    Подскажите кто знает.
     
  2. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    wsprintfA PROTO C :lol: WORD,:VARARG
    wsprintf equ <wsprintfA>

    убери и перестанет ругаться компилятор

    + где проверки что за клавиша нажата?
     
  3. BuchoyJonn

    BuchoyJonn New Member

    Публикаций:
    0
    Регистрация:
    30 сен 2010
    Сообщения:
    2
    А да тут разобрался уже =)