DELPHI - KEYBOARD HOOK
Feladat: Van egy program motor vezérlő és garafikus komponenssel. Billentyűuzetről a nyilakkal akarom a motort vezérelni. Igen ám, de a Form1 KeyDown és KeyPress eseménye nem érzékeli a nyilakat. Valószínűleg valamelyik komponens elveszi a nyilak érzékelésének eseményét (CM_CHILDKEY).
Ezért a Win API keyboard Hook kezeléséhez kellett folyamodnom.
Megoldás:
var
Form1: TForm1;
KBHook: HHook; {this intercepts keyboard input}
{callback's declaration}
function KeyboardHookProc(Code: Integer; WordParam: Word; LongParam: LongInt): LongInt; stdcall;
Form1: TForm1;
KBHook: HHook; {this intercepts keyboard input}
{callback's declaration}
function KeyboardHookProc(Code: Integer; WordParam: Word; LongParam: LongInt): LongInt; stdcall;
implementation
{$R *.dfm}
function KeyboardHookProc(Code: Integer; WordParam: Word;
LongParam: Integer): LongInt;
var cmd: integer;
begin
cmd := -1;
with Form1 do
begin
Label1.Caption := IntToStr(WordParam)+' '+IntToStr(LongParam) ;
Case WordParam of
VK_LEFT : cmd := 0;
VK_UP : cmd := 1;
VK_RIGHT : cmd := 2;
VK_DOWN : cmd := 3;
end;
if LongParam<0 then // Ha felengedem a nyilat (KeyUp)
cmd := 4;
doMotor(cmd);
oldChar := WordParam;
end;
Result:=0;
end;
procedure TForm1.doMotor(cmd: integer);
begin
case cmd of
0: Motor.Left;
1: Motor.Up;
2: Motor.Right;
3: Motor.Down;
4: Motor.NewSTOP;
end;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
KBHook:=SetWindowsHookEx(WH_KEYBOARD,
{callback >} @KeyboardHookProc,
HInstance,
GetCurrentThreadId()) ;
end;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
UnHookWindowsHookEx(KBHook);
end;
______________________________________________________________________________
2.
GetKeyboardState(KeyState); // után
KeyState[VK_CAPITAL] := GetKeyState(VK_CAPITAL);
KeyState[VK_SHIFT] := GetKeyState(VK_SHIFT);
KeyState[VK_CONTROL] := GetKeyState(VK_CONTROL);
KeyState[VK_MENU] := GetKeyState(VK_MENU);
Nincsenek megjegyzések:
Megjegyzés küldése