program Project1;
uses
Forms,
Unit1 in '..\Hooks1\Unit1.pas' {Form1};
{$R *.RES}begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* //library SendKey;
uses
SysUtils, Classes, Windows, Messages;
const{пользовательские сообщения}
wm_LeftShow_Event = wm_User + 133;
wm_RightShow_Event = wm_User + 134;
wm_UpShow_Event = wm_User + 135;
wm_DownShow_Event = wm_User + 136;
{handle для ловушки}
HookHandle: hHook = 0;
var
SaveExitProc: Pointer;
{собственно ловушка}function Key_Hook(Code: integer; wParam: word;
lParam: Longint): Longint; stdcall; export;
var
H: HWND;
begin{если Code>=0, то ловушка может обработать событие}if (Code >= 0) and (lParam and $40000000 = 0) thenbegin{ищем окно по имени класса и по заголовку
(Caption формы управляющей программы должен быть равен 'XXX' !!!!)}
H := FindWindow('TForm1', 'XXX');
{это те клавиши?}case wParam of
VK_Left: SendMessage(H, wm_LeftShow_Event, 0, 0);
VK_Right: SendMessage(H, wm_RightShow_Event, 0, 0);
VK_Up: SendMessage(H, wm_UpShow_Event, 0, 0);
VK_Down: SendMessage(H, wm_DownShow_Event, 0, 0);
end;
{если 0, то система должна дальше обработать это событие}{если 1 - нет}
Result := 0;
endelseif Code < 0 {если Code<0, то нужно вызвать следующую ловушку}then
Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;
{при выгрузке DLL надо снять ловушку}procedure LocalExitProc; far;
beginif HookHandle <> 0 thenbegin
UnhookWindowsHookEx(HookHandle);
ExitProc := SaveExitProc;
end;
end;
exports Key_Hook;
{инициализация DLL при загрузке ее в память}begin{устанавливаем ловушку}
HookHandle := SetWindowsHookEx(wh_Keyboard, @Key_Hook,
hInstance, 0);
if HookHandle = 0 then
MessageBox(0, 'Unable to set hook!', 'Error', mb_Ok)
elsebegin
SaveExitProc := ExitProc;
ExitProc := @LocalExitProc;
end;
end.
// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* //object Form1: TForm1
Left = 200
Top = 104
Width = 544
Height = 375
Caption = 'XXX'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 128
Top = 68
Width = 32
Height = 13
Caption = 'Label1'
endend// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* //unit Unit1;
interfaceuses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
{пользовательские сообщения}const
wm_LeftShow_Event = wm_User + 133;
wm_RightShow_Event = wm_User + 134;
wm_UpShow_Event = wm_User + 135;
wm_DownShow_Event = wm_User + 136;
type
TForm1 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
private//Обработчики сообщенийprocedure WM_LeftMSG(var M: TMessage);
message wm_LeftShow_Event;
procedure WM_RightMSG(var M: TMessage);
message wm_RightShow_Event;
procedure WM_UpMSG(var M: TMessage);
message wm_UpShow_Event;
procedure WM_DownMSG(var M: TMessage);
message wm_DownShow_Event;
end;
var
Form1: TForm1;
P: Pointer;
implementation{$R *.DFM}//Загрузка DLLfunction Key_Hook(Code: integer; wParam: word;
lParam: Longint): Longint; stdcall; external 'SendKey' name 'Key_Hook';
procedure TForm1.WM_LefttMSG(var M: TMessage);
begin
Label1.Caption := 'Left';
end;
procedure TForm1.WM_RightMSG(var M: TMessage);
begin
Label1.Caption := 'Right';
end;
procedure TForm1.WM_UptMSG(var M: TMessage);
begin
Label1.Caption := 'Up';
end;
procedure TForm1.WM_DownMSG(var M: TMessage);
begin
Label1.Caption := 'Down';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin{если не использовать вызов процедуры из DLL в программе,
то компилятор удалит загрузку DLL из программы}
P := @Key_Hook;
end;
end.
Программа на Delphi, использующая библиотеку SendKeys для создания хука клавиатуры, который захватывает и обрабатывает события ввода клавиш.
Вот разбивка кода:
Project1.pas
Эта файл содержит основной программный код, инициализирующий приложение, создает форму и запускает ее.
SendKey.dpr
Этот файл содержит DLL (динамическую связку библиотеки), которая реализует хук клавиатуры. Она экспортирует две функции: Key_Hook и LocalExitProc.
Key_Hook: Это функция, вызываемая при каждом событии ввода клавиш. Она проверяет, является ли это событие связанным с заголовком формы ('XXX') и отправляет сообщение форме, если так.
LocalExitProc: Эта функция вызывается, когда DLL разрушается, и она отменяет хук.
Unit1.pas
Этот файл содержит класс формы (TForm1), обрабатывающий сообщения, отправленные хуком клавиатуры. Он определяет четыре приватные процедуры (WM_LeftMSG, WM_RightMSG, WM_UpMSG и WM_DownMSG), которые обновляют заголовок метки в зависимости от полученного сообщения.
Функция Key_Hook
Функция Key_Hook вызывается при каждом событии ввода клавиш. Она проверяет, является ли код события больше или равно 0, что означает нормальное событие ввода клавиши. Если так, она находит окно с именем класса 'TForm1' и заголовком 'XXX', и отправляет сообщение этому окну в зависимости от нажатой клавиши (например, wm_LeftShow_Event для левой стрелки).
Если код события меньше 0, то это означает расширенное событие ввода клавиши, и функция вызывает следующий хук в цепи используя CallNextHookEx.
Ограничения
Код имеет некоторые ограничения:
1. Он только захватывает события ввода клавиш для конкретной формы с именем класса 'TForm1' и заголовком 'XXX'. Если вы хотите захватить события для других форм или окон, вам нужно изменить код.
2. Хук только обрабатывает клавиши VK_Left, VK_Right, VK_Up и VK_Down. Вы можете добавить более случаев для обработки других нажатий клавиш.
3. Этот код специфичен для Delphi и не будет работать с другими языками программирования.
Имущества
Некоторые возможные улучшения:
1. Вместо жесткого кодирования имени класса формы и заголовка, вы можете сделать их настроимыми используя файл настроек или диалог настройки.
2. Вы можете добавить более журналирования или механизмов отладки для помощи в диагностике проблем с хуком.
3. Рассмотрите возможность реализации более robust системы обработки ошибок, если хук не может установить или отменить себя.
В целом, этот код демонстрирует, как создать хук клавиатуры с помощью Delphi и библиотеки SendKeys. С некоторыми изменениями вы можете адаптировать его к своим конкретным потребностям.
Перехват клавиатуры - это программа Sendkeys, которая позволяет ловить события нажатия клавиш и изменять их обработку в зависимости от ситуации.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.