Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wie kann ich Maustaste 4 und 5 abfangen und darauf reagieren (https://www.delphipraxis.net/53586-wie-kann-ich-maustaste-4-und-5-abfangen-und-darauf-reagieren.html)

T3rm1n4T0r 20. Sep 2005 19:02

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Delphi-Quellcode:
library HookIt;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  Classes,
  windows;

{$R *.res}

var
  Keyboard_HookHandle: LongWord = 0;
  Mouse_HookHandle: LongWord = 0;

function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var PID, sizewritten, hFile: LongWord;
begin
  Result := CallNextHookEx(Mouse_HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    True: exit; // nicht anrühren wenns negativ ist
    False:
      begin
        hFile := CreateFile(PChar(ExtractFilePath(ParamStr(0)) + 'bootinfo.log'), GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
        if hFile <> INVALID_HANDLE_VALUE then
        try
          SetFilePointer(hFile, 0, nil, FILE_END);
          PID := GetCurrentProcessID;
          WriteFile(hFile, PID, sizeof(PID), sizewritten, nil);
          WriteFile(hFile, lParam, sizeof(lParam), sizewritten, nil);
          WriteFile(hFile, wParam, sizeof(wParam), sizewritten, nil);
        finally
          CloseHandle(hFile);
        end;
      end;
  end;
end;

function KbdHookProc(nCode: Integer; wParam: LongWord; lParam: LongWord): LongWord; stdcall;
var
  PID,
  sizewritten,
  hFile: LongWord;
begin
  Result := CallNextHookEx(Keyboard_HookHandle, nCode, wParam, lParam);
  case nCode < 0 of
    True: exit; // nicht anrühren wenns negativ ist
    False:
      begin
//      case ((lParam and $80000000) = 0) of
//        True: ; // WM_KEYDOWN
//      else // WM_KEYUP
        hFile := CreateFile(PChar(ExtractFilePath(ParamStr(0)) + 'bootinfo.log'), GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
        if hFile <> INVALID_HANDLE_VALUE then
        try
          SetFilePointer(hFile, 0, nil, FILE_END);
          PID := GetCurrentProcessID;
          WriteFile(hFile, PID, sizeof(PID), sizewritten, nil);
          WriteFile(hFile, lParam, sizeof(lParam), sizewritten, nil);
          WriteFile(hFile, wParam, sizeof(wParam), sizewritten, nil);
        finally
          CloseHandle(hFile);
        end;
      end;
  end;
end;

function SetHook(bSet: Boolean): Boolean; stdcall;
begin
  case bSet of
    True:
      begin
        if Keyboard_HookHandle = 0 then
          Keyboard_HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KbdHookProc, hInstance, 0);
        if Mouse_HookHandle = 0 then
          Mouse_HookHandle := SetWindowsHookEx(WH_MOUSE, @MouseHookProc, hInstance, 0);
        Result := Mouse_HookHandle and Keyboard_HookHandle <> 0;
      end;
  else
    Result := UnhookWindowsHookEx(Keyboard_HookHandle) and UnhookWindowsHookEx(Mouse_HookHandle);;
    Keyboard_HookHandle := 0;
    Mouse_HookHandle := 0;
  end;
end;

exports
  SetHook;


begin
end.

Also soweit hab ich das jetzt alles. Beide Hooks scheinen zu funktionieren. Wie krieg ich nun raus, ob Maustaste 4 oder 5 dabei ist?

Robert Marquardt 21. Sep 2005 04:55

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Was soll der ganze Murks? WM_XBUTTONDBLCLK, WM_XBUTTONDOWN, WM_XBUTTONUP.
WM_APPCOMMAND ist auch noch interessant, da dort die ganzen Multimediatasten gemeldet werden.

T3rm1n4T0r 21. Sep 2005 11:42

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Wäre nett, wenn du das ein bisschen genauer erklären könntest. Wie kann ich dieses Messages denn systemweit abfangen?
Und so wie ich es gemacht habe, müsste es doch eigentlich auch gehen oder? Mir fehlt halt nur die Erkennung der bestimmten Maustaste.

Robert Marquardt 21. Sep 2005 11:51

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Sorry, ich habe die urspruengliche Frage nicht ganz durchgelesen. Das "systemweit" ist mir entgangen.
Bist du sicher das du ueberhaupt WM_XBUTTON Messages kriegst?
Wenn du beispielsweise mit einer Maussoftware die Buttons speziell belegt hast, dann mappt der Treiber schon die Tastendruecke weg.

T3rm1n4T0r 21. Sep 2005 11:55

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Also bei mir sind die Tasten mit Vor und Zurück belegt. Aber das dürfte doch nichts daran ändern, dass man erkennt, ob eine dieser Tasten gedrückt worden ist. In Spielen kann man diese Tasten ja auch belegen, egal was für eine Funktion man ihnen im Treiber gegeben hat.
Und das möchte ich auch irgendwie hinbekommen.

Robert Marquardt 21. Sep 2005 12:04

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Schon verloren. Du vrstehst offensichtlich nicht wie das alles funktioniert.

Die Maussoftware von Logitech oder Kensington installieren einen Filtertreiber fuer die Maeuse.
Dieser Treiber hat einen Seitenausgang den nur das ebenfalls installierte Tray-Programm kennt.
Wird nun eine Maustaste im Tray-Programm speziell belegt, so wird der treiber angewiesen diese Taste nur noch ueber den Seitenausgang herauszugeben.
Windows kennt nur den normalen Zugriff auf den Treiber und bekommt nun nie mehr diese Maustaste zu Gesicht. Entsprechend gibt es keine Messages dazu.
Das Tray-Programm seinerseits fuehrt nun die spezielle Belegung aus. Das ist aber nun kein Button 4 oder 5 mehr, ausser das ist die spezielle Belegung.

NicoDE 21. Sep 2005 12:04

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Zitat:

Zitat von T3rm1n4T0r
In Spielen kann man diese Tasten ja auch belegen, egal was für eine Funktion man ihnen im Treiber gegeben hat.

Erwähnte ich eigentlich schon, dass die Spiele eine andere API verwenden...

T3rm1n4T0r 21. Sep 2005 12:06

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Also ist es nicht möglich, so einen Mausklick abzufangen?

Robert Marquardt 21. Sep 2005 12:06

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Wenn es eine Belegung im Treiber ist, dann bekommt selbst DirectInput nichts mehr zu Gesicht, denn es setzt ja auf den Treibern auf.
Der installierte Filtertreiber verhindert aber das ein Button 4 oder 5 ueberhaupt aus dem Treiber herauskommt wenn die Belegung das besagt.

Robert Marquardt 21. Sep 2005 12:08

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Zitat:

Zitat von T3rm1n4T0r
Also ist es nicht möglich, so einen Mausklick abzufangen?

Nicht solange du Tasten in der logitech-software mit anderen Funktionen belegt hast.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 Uhr.
Seite 2 von 3     12 3      

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