Привет! Вот у меня одна проблемма! Может кто нибудь из вас поможет мне. С низу преведён исходник Hook'а каторый перехватывает нажатие NumPad_1 кнопки и эмулирует нажатие NumPad_2. Бпоблема заключается в том что программа эиулирует 2 раза. Я не понимаю в чём дело -> и меня это загоняет! Так что помогите pls! Код (Text): format PE GUI 4.0 DLL entry DllEntryPoint include '%include%\win32a.inc' section '.data' data writeable readable VK_NUMPAD1 equ 61h VK_NUMPAD2 equ 62h hHook dd 0 hInstance dd 0 section '.code' code readable executable proc DllEntryPoint, hInst, wReason, lpReserved enter push [hInst] 1 pop [hInstance] xor eax,eax inc eax return endp ;-------------------------------------------------------------; proc CallBack, code, wparam, lparam enter cmp [code],HC_ACTION jne @F cmp [wparam],VK_NUMPAD1 jne @F stdcall EmulKey,VK_NUMPAD2 @@: invoke CallNextHookEx, [hHook],[code],[wparam],[lparam] return endp ;-------------------------------------------------------------; proc Hook, boolean enter cmp [boolean],1 jne .KillHook invoke SetWindowsHookEx, WH_KEYBOARD,CallBack,[hInstance],0 test eax,eax jz .BadQuit mov [hHook], eax jmp .GoodQuit .KillHook: invoke UnhookWindowsHookEx, [hHook] ;киляется... dec eax jz .GoodQuit .BadQuit: xor eax,eax return .GoodQuit: xor eax,eax inc eax return endp ;-------------------------------------------------------------; proc EmulKey,VK_KEY ; Эмуляция нажатия кнопки enter push ebx xor eax,eax push eax push eax push eax invoke MapVirtualKey,[VK_KEY] mov ebx,eax invoke keybd_event,[VK_KEY],ebx,KEYEVENTF_EXTENDEDKEY invoke keybd_event,[VK_KEY],ebx,KEYEVENTF_EXTENDEDKEY+KEYEVENTF_KEYUP pop ebx return endp section '.idata' import data readable writeable library kernel,'KERNEL32.DLL',\ user, 'user32.dll' import kernel,\ CreateFileMapping,'CreateFileMappingA',\ MapViewOfFile,'MapViewOfFile',\ Sleep,'Sleep',\ UnmapViewOfFile,'UnmapViewOfFile',\ CloseHandle,'CloseHandle' import user,\ SetWindowsHookEx, 'SetWindowsHookExA',\ UnhookWindowsHookEx, 'UnhookWindowsHookEx',\ CallNextHookEx, 'CallNextHookEx',\ MessageBox,'MessageBoxA',\ SendMessage,'SendMessageA',\ keybd_event,'keybd_event',\ MapVirtualKey,'MapVirtualKeyA',\ SetWindowText,'SetWindowTextA',\ PostMessage,'PostMessageA',\ RegisterWindowMessage,'RegisterWindowMessageA' ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; section '.edata' export data readable writeable export 'Eric.dll',\ Hook, 'HookNumpad1' ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; section '.reloc' fixups data readable discardable ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;
А где именно в коде ты реагируешь на нажатие клавиши? Лично я вижу, что ты этого не проверяешь, а именно нажата клавиша или отжата, потому у тебя и реагирует 2 раза: 1-й на нажатие, 2-й на отжатие.
Код (Text): ;-------------------------------------------------------------; proc CallBack, code, wparam, lparam enter cmp [code],HC_ACTION jne @F mov edx,lparam shr edx,16 and edx,KF_UP ;реагируем на отжатие клавиши, ;можно и KF_REPEAT добавить, т.е. ; and edx,KF_UP or KF_REPEAT jnz @F cmp [wparam],VK_NUMPAD1 jne @F stdcall EmulKey,VK_NUMPAD2 @@: invoke CallNextHookEx, [hHook],[code],[wparam],[lparam] return endp ;-------------------------------------------------------------; ;KF_REPEAT equ 4000h ;KF_UP equ 8000h с синтаксисом FASM не знаком, потому могут быть ошибки