Содержание материала

 

Для посылки сообщения лучше использовать PostMessage, т.к. она, в отличие от SendMessage просто помещает сообщение в очередь, не задерживая программу на время его обработки.

В вызывающем приложении необходимо написать следующий код:

Code:

unit HookForm;

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

 

type

TForm1 = class(TForm)

   cbSetHook: TCheckBox;

   Memo1: TMemo;

   procedure cbSetHookClick(Sender: TObject);

   procedure FormCreate(Sender: TObject);

   procedure FormDestroy(Sender: TObject);

private

   procedure AppOnMessage(var Msg: TMsg; var Handled: Boolean);

end;

 

var

Form1: TForm1;

 

implementation

 

uses Exchange;

 

{$R *.DFM}

 

// Объявляем прототип функции SetHook

function SetHook(Activate: BOOL): BOOL; stdcall;

external 'HookDLL.DLL';

 

procedure TForm1.cbSetHookClick(Sender: TObject);

// Это функция-обработчик компонента TCheckBox

// В зависимости от него состояния она устанавливает

// или снимает перехватчик клавиатуры

begin

SetHook(cbSetHook.Checked);

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

// Очищаем область обмена

FillChar(CommonArea^, SizeOf(CommonArea^), 0);

// Сообщения от ловушки будут посылаться приложению

CommonArea^.FormHandle := Application.Handle;

// Устанавливаем обработчик сообщений

Application.OnMessage := AppOnMessage;

end;

 

procedure TForm1.FormDestroy(Sender: TObject);

// По завершении программы не забываем снять ловушку.

begin

if cbSetHook.Checked then

   SetHook( FALSE );

end;

 

procedure TForm1.AppOnMessage(var Msg: TMsg; var Handled: Boolean);

var

Buffer: array[0..50] of Char;

S: String;

Flags : Word;

begin

if Msg.Message = Exchange.WMKeyHook then

begin

   // Получаем наименование нажатой клавиши

   GetKeyNameText(Msg.lParam, @Buffer, SizeOf(Buffer));

   S := StrPas(Buffer);

   Flags := Msg.lParam shr 16;

   if (Flags and KF_UP) <> 0 then

     S := S + ' down'

   else if (Flags and KF_REPEAT) <> 0 then

     S := S + ' repeat'

   else S := S + ' up';

   Memo1.Lines.Add(S);

   Handled := TRUE;

end;

end;

 

end.

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить