Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Maus Hook für XButtons auswerten (https://www.delphipraxis.net/212074-maus-hook-fuer-xbuttons-auswerten.html)

KodeZwerg 13. Dez 2022 14:56

Maus Hook für XButtons auswerten
 
Hallo, ich habe mir einen Maushook gebastelt um auch außerhalb meiner App auf die XButtons (diese zwei Knöpfe meist seitlich an einer Maus) reagieren zu können.
Reagieren funktioniert soweit aber ich finde leider keine Informationen wie ich den "mouseData" Inhalt vernünftig auswerten muss um zwischen den beiden Knöpfen unterscheiden zu können.

Zur zeit mache ich es so wie hier, aber bin nicht davon überzeugt ob es korrekt ist.
Delphi-Quellcode:
  TForm1 = class(TForm)
    Label6: TLabel;
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormCreate(Sender: TObject);
  end;

type
  TMSLLHOOKSTRUCT = record
    pt         : TPoint;
    mouseData  : DWORD;
    flags      : DWORD;
    time       : DWORD;
    dwExtraInfo : DWORD;
  end;

function LowLevelMouseProc(nCode: LongInt; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

var
  Form1: TForm1;
  mHook: HHOOK;

implementation

function LowLevelMouseProc(nCode: LongInt; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  Info : ^TMSLLHOOKSTRUCT absolute lParam;
begin
  Result := CallNextHookEx(mHook, nCode, wParam, lParam);
  with Info^ do
    begin
      case wParam of
        WM_XBUTTONDOWN : if (mouseData > Succ(High(Word))) then
                           Form1.Label6.Caption := 'WM_XBUTTONDOWN (up) pressed'
                         else
                           Form1.Label6.Caption := 'WM_XBUTTONDOWN (down) pressed';
        WM_XBUTTONUP  : if (mouseData > Succ(High(Word))) then
                           Form1.Label6.Caption := 'WM_XBUTTONUP (up) pressed'
                         else
                           Form1.Label6.Caption := 'WM_XBUTTONUP (down) pressed';
      end;
    end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  UnhookWindowsHookEx(mHook);
  CanClose := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
const
  WH_MOUSE_LL = LongInt(14);
begin
  mHook := SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseProc, hInstance, 0);
end;

end.
Vielleicht kennt sich ja jemand damit aus? Danke!

himitsu 13. Dez 2022 15:25

AW: Maus Hook für XButtons auswerten
 
steht doch eigentlich in der Hilfe, wie dieser Wert aufgebaut ist. :angle:

https://learn.microsoft.com/en-us/wi...ectedfrom=MSDN

KodeZwerg 13. Dez 2022 15:37

AW: Maus Hook für XButtons auswerten
 
Zitat:

Zitat von himitsu (Beitrag 1516133)
steht doch eigentlich in der Hilfe, wie dieser Wert aufgebaut ist. :angle:

https://learn.microsoft.com/en-us/wi...ectedfrom=MSDN

Vielen Dank, klappt jetzt wie es sein sollte! :thumb:

BerndS 13. Dez 2022 15:54

AW: Maus Hook für XButtons auswerten
 
Wenn man davon ausgeht, das immer irgendwo was schief gehen kann, dann sollte das
Code:
   UnhookWindowsHookEx(mHook);
besser im FormDestroy erfolgen.
OnClose / OnCloseQuery ist dafür nicht das richtige Ereignis, da es nicht sichergestellt ist, das es immer aufgerufen wird.

Aber wäre es nicht besser diesen Hook nur zu aktivieren, wenn das Form den Focus hat?
Da wäre OnActivate / OnDeactivate das passende Ereignis.

KodeZwerg 13. Dez 2022 16:40

AW: Maus Hook für XButtons auswerten
 
Danke für den Destroy Hinweis! Hab auch mein Record gefixt. Nein, es geht um eine Art side-panel wo man Infos durchblättern kann auch wenn der Fokus weg ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 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