2021. február 25., csütörtök

 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;

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;

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

 DELPHI - KEYBOARD HOOK Feladat : Van egy program motor vezérlő és garafikus komponenssel. Billentyűuzetről a nyilakkal akarom a motort vezé...