Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Перехват (Hook) клавиатуры (программа Sendkeys)

Delphi , ОС и Железо , Клавиши

Перехват (Hook) клавиатуры (программа Sendkeys)

Автор: Bogachev

Всю ночь потел над непослушной Клавой...


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) then
  begin
    {ищем окно по имени класса и по заголовку
    (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;
  end

  else if Code < 0 {если Code<0, то нужно вызвать следующую ловушку} then
    Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;

{при выгрузке DLL надо снять ловушку}

procedure LocalExitProc; far;
begin

  if HookHandle <> 0 then
  begin
    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)
  else
  begin
    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'
  end
end

// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* //

unit Unit1;

interface

uses
  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}

//Загрузка DLL

function 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Клавиши ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 19:45:40/0.0038440227508545/0