
23.03.2013, 14:05
|
 |
LMD-DML
|
|
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
|
|
Нашёл попроще способ
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
kbHook: HHOOK;
function kbProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
begin
Result := CallNextHookEx(kbHook, nCode, WParam, LParam);
if WParam = WM_KEYDOWN {WM_KEYUP} then // можно определить лишь нажата\ отжата :-)
// Вот здесь всё и происходит, проверил, работает и в "свёрнутом" виде
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
kbHook := SetWindowsHookEx(13, @kbProc, HInstance, 0);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnhookWindowsHookEx(kbHook);
end;
end.
Только состояние клавиши подставить
Добавлено позже
З.Ы. А вот что с "горячей" клавишей "а" получилось
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
tmr1: TTimer;
mmo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure tmr1Timer(Sender: TObject);
private
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.tmr1Timer(Sender: TObject);
begin
keybd_event(VK_SPACE,0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event(VK_SPACE,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
if tmr1.Enabled then
begin
tmr1.Enabled:= false;
mmo1.Lines.Add('off');
end else
begin
tmr1.Enabled:= true;
mmo1.Lines.Add('on');
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(Form1.Handle, 65, 0, 65);
tmr1.Enabled:=false;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(Form1.Handle, 65);
end;
end.
|