Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Kompomente "klaut" Pfeiltasten, Keyboard-Hook ? (https://www.delphipraxis.net/148137-kompomente-klaut-pfeiltasten-keyboard-hook.html)

hoika 23. Feb 2010 13:17


Kompomente "klaut" Pfeiltasten, Keyboard-Hook ?
 
Hallo #,

ich habe hier eine Komponente (kein Src-Code).
Packe ich die auf das Form und gebe ihr den Focus,
bekommt mein Form keine Pfeiltasten-Nachrichten mehr,
auch bei KeyPreview=True.

Sieht so aus, als setzt die einen Hook.

Bin ich schlau, setze auch einen, aber
die Methode MoveLeft wird jetzt 3mal aufgerufen.

Wie kann ich das verhindern ?

Danke


Heiko


Delphi-Quellcode:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ieview, imageenview, hyieutils,  hyiedefs,
  imageenproc;

type
  TForm3 = class(TForm)
    ImageEnView1: TImageEnView;
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private-Deklarationen }
    procedure MoveLeft;
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;
  KBHook: HHook;
  function KeyboardHookProc(Code: Integer; WordParam: Word; LongParam: LongInt): LongInt; stdcall;

implementation

{$R *.dfm}

function KeyboardHookProc(Code: Integer; WordParam: Word; LongParam: LongInt): LongInt; stdcall;
var
  Key: Word;
begin
  case WordParam of
    VK_LEFT:
      begin
        Key:= WordParam;
        LongParam:= 1;
        Form3.MoveLeft;
        Result:= 0;
        Exit;
      end;
  end;

  Result:= CallNextHookEx(KBHook, Code, WordParam, LongParam);
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  inherited ;

  KBHook:= SetWindowsHookEx(WH_KEYBOARD,
    @KeyboardHookProc, HInstance, GetCurrentThreadId());
end;

procedure TForm3.FormDestroy(Sender: TObject);
begin
  UnHookWindowsHookEx(KBHook) ;
end;

procedure TForm3.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key=VK_ESCAPE then
  begin
    Close;
  end;
  if Key=VK_LEFT then
  begin
    ShowMessage('Left');
    Key:= 0;
  end;
  if Key=VK_RIGHT then
  begin
    ShowMessage('Right');
  end;
end;

procedure TForm3.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key=VK_ESCAPE then
  begin
    Close;
  end;
  if Key=VK_LEFT then
  begin
    ShowMessage('Left');
    Key:= 0;
  end;
  if Key=VK_RIGHT then
  begin
    ShowMessage('Right');
  end;
end;

procedure TForm3.FormShow(Sender: TObject);
begin
  ImageEnView1.SetFocus;
end;

procedure TForm3.MoveLeft;
begin
  ShowMessage('MoveLeft');
end; { MoveLeft }

end.

hoika 23. Feb 2010 13:28

Re: Kompomente "klaut" Pfeiltasten, Keyboard-Hook
 
Hallo,

Teil-Lösung:

Delphi-Quellcode:
function KeyboardHookProc(Code: Integer; WordParam: Word; LongParam: LongInt): LongInt; stdcall;
begin
  if Code>0 then
  begin
    case WordParam of
      VK_LEFT:
        begin
          WordParam:= 0;
          Form3.MoveLeft;
          Result:= 1;
          Exit;
        end;
    end;
  end;

  Result:= CallNextHookEx(KBHook, Code, WordParam, LongParam);
end;
so in etwa beschrieben bei MSDN

KeyboardProc


Problem:
Die Form-Methode wird "irgendwie" zweimal aufgerufen.
Setze ich dort einen Breakpoint oder ein ShowMessage, nicht.

Ein EmptyKeyQueue via PeekMessage klappt auch nicht ;(


Heiko

hoika 23. Feb 2010 14:39

Re: Kompomente "klaut" Pfeiltasten, Keyboard-Hook
 
Hallo,

danke für die zahlreichen Hinweise ;)

Die Komponente hatte ein zusätzliches OnKey für Pfeil-Tasten.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz