Для посылки сообщения лучше использовать 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. |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!