PYCHO - случай!

Тема в разделе "WASM.WIN32", создана пользователем Songoku, 8 сен 2004.

Статус темы:
Закрыта.
  1. Songoku

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    Привет!

    Вот у меня одна проблемма! Может кто нибудь из вас поможет мне. С низу преведён исходник Hook'а каторый перехватывает нажатие NumPad_1 кнопки и эмулирует нажатие

    NumPad_2. Бпоблема заключается в том что программа эиулирует 2 раза. Я не понимаю в чём дело -> и меня это загоняет! Так что помогите pls!


    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DllEntryPoint
    3. include '%include%\win32a.inc'
    4.  
    5. section '.data' data writeable readable
    6.  
    7. VK_NUMPAD1  equ    61h
    8. VK_NUMPAD2  equ    62h
    9.  
    10.   hHook        dd   0
    11.   hInstance    dd   0
    12.  
    13.  
    14. section '.code' code readable executable
    15.  
    16. proc DllEntryPoint, hInst, wReason, lpReserved
    17.     enter
    18.     push   [hInst]                                                                    1
    19.     pop    [hInstance]
    20.     xor    eax,eax
    21.     inc    eax
    22. return
    23. endp
    24. ;-------------------------------------------------------------;
    25.  proc CallBack, code, wparam, lparam
    26.     enter
    27.     cmp     [code],HC_ACTION
    28.     jne     @F
    29.     cmp     [wparam],VK_NUMPAD1
    30.     jne     @F
    31.     stdcall EmulKey,VK_NUMPAD2
    32.     @@:
    33.  
    34.     invoke  CallNextHookEx, [hHook],[code],[wparam],[lparam]
    35.  
    36.     return
    37.     endp
    38. ;-------------------------------------------------------------;
    39.  proc Hook, boolean
    40.     enter
    41.     cmp    [boolean],1
    42.     jne    .KillHook
    43.  
    44.     invoke SetWindowsHookEx, WH_KEYBOARD,CallBack,[hInstance],0
    45.     test   eax,eax
    46.     jz     .BadQuit
    47.     mov    [hHook], eax
    48.     jmp    .GoodQuit
    49.  .KillHook:
    50.     invoke UnhookWindowsHookEx, [hHook]      ;киляется...
    51.     dec    eax
    52.     jz     .GoodQuit
    53.  .BadQuit:
    54.     xor    eax,eax
    55.     return
    56.  .GoodQuit:
    57.  
    58.     xor    eax,eax
    59.     inc    eax
    60.     return
    61.     endp
    62. ;-------------------------------------------------------------;
    63.  
    64. proc EmulKey,VK_KEY       ; Эмуляция нажатия кнопки
    65. enter
    66.   push    ebx
    67.   xor     eax,eax
    68.   push    eax
    69.   push    eax
    70.   push    eax
    71.   invoke  MapVirtualKey,[VK_KEY]
    72.   mov     ebx,eax
    73.   invoke  keybd_event,[VK_KEY],ebx,KEYEVENTF_EXTENDEDKEY
    74.   invoke  keybd_event,[VK_KEY],ebx,KEYEVENTF_EXTENDEDKEY+KEYEVENTF_KEYUP
    75.   pop     ebx
    76. return
    77. endp
    78.  
    79. section '.idata' import data readable writeable
    80.  
    81.  library kernel,'KERNEL32.DLL',\
    82.          user, 'user32.dll'
    83.  
    84.  import kernel,\
    85.         CreateFileMapping,'CreateFileMappingA',\
    86.         MapViewOfFile,'MapViewOfFile',\
    87.         Sleep,'Sleep',\
    88.         UnmapViewOfFile,'UnmapViewOfFile',\
    89.         CloseHandle,'CloseHandle'
    90.  
    91.  import user,\
    92.         SetWindowsHookEx, 'SetWindowsHookExA',\
    93.         UnhookWindowsHookEx, 'UnhookWindowsHookEx',\
    94.         CallNextHookEx, 'CallNextHookEx',\
    95.         MessageBox,'MessageBoxA',\
    96.         SendMessage,'SendMessageA',\
    97.         keybd_event,'keybd_event',\
    98.         MapVirtualKey,'MapVirtualKeyA',\
    99.         SetWindowText,'SetWindowTextA',\
    100.         PostMessage,'PostMessageA',\
    101.         RegisterWindowMessage,'RegisterWindowMessageA'
    102. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
    103. section '.edata' export data readable writeable
    104.  
    105.  export 'Eric.dll',\
    106.         Hook, 'HookNumpad1'
    107. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
    108. section '.reloc' fixups data readable discardable
    109. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;                  
     
  2. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    А где именно в коде ты реагируешь на нажатие клавиши?

    Лично я вижу, что ты этого не проверяешь, а именно нажата клавиша или отжата, потому у тебя и реагирует 2 раза: 1-й на нажатие, 2-й на отжатие.
     
  3. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    Код (Text):
    1. ;-------------------------------------------------------------;
    2.  proc CallBack, code, wparam, lparam
    3.     enter
    4.     cmp     [code],HC_ACTION
    5.     jne     @F
    6.     mov     edx,lparam
    7.     shr     edx,16
    8.     and     edx,KF_UP ;реагируем на отжатие клавиши,
    9.                               ;можно и KF_REPEAT добавить, т.е.
    10. ;   and     edx,KF_UP or KF_REPEAT
    11.     jnz     @F
    12.     cmp     [wparam],VK_NUMPAD1
    13.     jne     @F
    14.     stdcall EmulKey,VK_NUMPAD2
    15.     @@:
    16.  
    17.     invoke  CallNextHookEx, [hHook],[code],[wparam],[lparam]
    18.  
    19.     return
    20.     endp
    21. ;-------------------------------------------------------------;
    22. ;KF_REPEAT       equ 4000h
    23. ;KF_UP           equ 8000h




    с синтаксисом FASM не знаком, потому могут быть ошибки :)
     
Статус темы:
Закрыта.