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 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 19. Sep 2005 15:10


Wie kann ich Maustaste 4 und 5 abfangen und darauf reagieren
 
Hi,
ich bin gerade dabei ein Programm zu basteln, das auf Mausklicks der 4 und 5. Taste reagieren soll. Leider weiß ich nicht, wie ich das anstellen soll. Kann mir da jemand weiterhelfen?
Ich denke mal, dass die beiden Tasten treiberbedingt sind, aber in Spielen ist es ja auch mögliche diese zu verwenden.
Wichtig ist, dass der Mausklick systemweit registriert wird, also nicht nur in der eigenen Anwendung!
Gruß T3rm1

Chegga 19. Sep 2005 15:26

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

Schau mal hier vorbei:
Tasten Abfragen :zwinker:

Ein bisschen suchen schadet nie. :roll:

MfG Marc

tommie-lie 19. Sep 2005 15:36

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

Zitat von Chegga
Schau mal hier vorbei:
Tasten Abfragen :zwinker:

Und welcher der Virtual Keycodes ist für zusätzliche Maustasten, die über primäre und sekundäre Edit: und mittlere Maustaste hinausgehen?

Zitat:

Zitat von Chegga
Ein bisschen suchen schadet nie. :roll:

Ein bisschen Denken auch nicht :zwinker:

Sharky 19. Sep 2005 15:37

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Hai Marc,

wo wird denn auf der Seite die vierte oder fünfte Maustaste erwähnt?
Zitat:

Zitat von Chegga
.... Ein bisschen suchen schadet nie. :roll:

Ich suche und suche und sehe es nicht :roll:

Chegga 19. Sep 2005 15:44

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

Zitat:

Zitat von Sharky
wo wird denn auf der Seite die vierte oder fünfte MAUStaste erwähnt?

:wall:
Ich dachte im meinem ersten Post an die Tasten 4 & 5... :oops:
:wall:

Zitat:

Zitat von tommie
Zitat:

Zitat von Meine Wenigkeit
Ein bisschen suchen schadet nie. :roll:

Ein bisschen Denken auch nicht :zwinker:

That's all right with me. :mrgreen:

MfG Marc

NicoDE 19. Sep 2005 15:45

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

Zitat von T3rm1n4T0r
aber in Spielen ist es ja auch mögliche diese zu verwenden.

Dort wird aber eine andere API verwendet (DirectInput).

Wenn der Maustreiber halbwegs etwas taugt, werden die Ereignisse (zumindest ab Windows XP) als XBUTTON1/XBUTTON2 durchgereicht:
Delphi-Quellcode:
// WinNT.h
const
//...
  VK_XBUTTON1       = $05;   // NOT contiguous with L & RBUTTON
  VK_XBUTTON2       = $06;   // NOT contiguous with L & RBUTTON
//...
  WM_NCXBUTTONDOWN               = $00AB;
  WM_NCXBUTTONUP                 = $00AC;
  WM_NCXBUTTONDBLCLK             = $00AD;
//...
  WM_XBUTTONDOWN                 = $020B;
  WM_XBUTTONUP                   = $020C;
  WM_XBUTTONDBLCLK               = $020D;

leddl 19. Sep 2005 15:50

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

Zitat von T3rm1n4T0r
Hi,
ich bin gerade dabei ein Programm zu basteln, das auf Mausklicks der 4 und 5. Taste reagieren soll.

Was ist, wenn der Benutzer das gar nicht will? :gruebel: Die meisten Leute, die ich kenne, die ne Maus mit Extra-Maustasten besitzen, haben sich diese Maustasten per Treiber mit Sonderfunktionen (wie Shift, Strg, Doppelklick, ...) belegt.
Das nur als kleiner Einwand, ohne viel zum Thema beizutragen :mrgreen:

T3rm1n4T0r 19. Sep 2005 17:24

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Ok, wenn man die XBUTTON1 & 2 dem entspricht, wäre das ja schonmal was. Aber wie kann ich systemweit überprüfen, ob einer der besagten Tasten gedrückt wurde?
Des weiteren kann man dies zum Beispiel auch nicht im OnMouseDown Ereignis überprüfen. Und OnKeyPress spring beim Mausklicken nciht an. Aber da das Programmbezogen ist, will ich das ja eh nicht.

tommie-lie 19. Sep 2005 17:29

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

Zitat von T3rm1n4T0r
Ok, wenn man die XBUTTON1 & 2 dem entspricht, wäre das ja schonmal was. Aber wie kann ich systemweit überprüfen, ob einer der besagten Tasten gedrückt wurde?

Mit 'nem Hier im Forum suchenHook oder, weil's 'nen Virtual Keycode dafür gibt, mit 'nem [dp="RegisterHotkey"]Hotkey[/dp].

T3rm1n4T0r 19. Sep 2005 17:56

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Ok, ich versuch es gerade über Hotkeys. Das Problem ist, dass man den Mausklick nur abfangen kann, wenn man Alt, Windowstaste oder Shifttaste drückt.
Delphi-Quellcode:
fsModifiers
[in] Specifies keys that must be pressed in combination with the key specified by the uVirtKey parameter in order to generate the WM_HOTKEY message. The fsModifiers parameter can be a combination of the following values.
MOD_ALT
Either ALT key must be held down.
MOD_CONTROL
Either CTRL key must be held down.
MOD_SHIFT
Either SHIFT key must be held down.
MOD_WIN
Either WINDOWS key was held down. These keys are labeled with the Microsoft® Windows® logo
Das möchte ich ja aber nicht.
Aber auch das funktioniert im übrigen bei mir nicht.

Über einen Hook kann ich jede Tastatureinfgabe erfolgreich abfangen, bei der Maus jedoch nicht.

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.

NicoDE 21. Sep 2005 12:11

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?

Da hier schon zweimal 'Spiele' eingeworfen wurden, rate ich einfach mal drauf los - und behaupte, dass du die X-Tasten in einem Spiel (welches natürlich nicht von dir geschrieben wurde) modifizieren möchtest...
Unmöglich ist es nicht. Ein allgemeine - alles erschlagende - Lösung sprengt den Rahmen dieses Forums. Für ein DirectX-Spiel könnte man einen COM-Hook schreiben (auf die Interfaces von DirectInput natürlich)... aber das ist alles andere als trivial (und wäre hinfällig, falls das Spiel gar nicht auf DirectInput zugreift).

T3rm1n4T0r 21. Sep 2005 13:02

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Also ich hab mir mal die Mauseinstellungen angegcukt und mir ist dabei aufgefallen das besagte Tasten bei mir folgende bezeichnung haben:
Daumentsten1: Taste4/Vor
Daumentaste2: Taste5/Zurück

Da diese auch als Taste 4 und 5 belegt sind, bin ich fest davon überzeugt, dass es doch mit einem Hook oder mit einer Message möglich ist, einen Tastendruck abzufangen. Was meint ihr?

Ist übrigens der Logitech Treiber.


//EDIT
Es wird tatsächlich an ein Fenster die WM_XBUTTONDOWN Message gesendet. Kann man wunderbar abfangen :)
Also dürfte das auch global über einen Hook funktionieren, richtig?
Wenn ja, bleibt mein Problem immer noch, wie in welchem Zusammenhang die Parameter zur Message in der Mauscallbackfunction stehen. Sprich, welcher Parameter definiert, welche Taste gedrückt wurde.

Robert Marquardt 21. Sep 2005 13:25

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Schreib doch mal schnell eine Applikation die die WM_XBUTTON Messages abfaengt.
Klick mit 4 und 5 drauf und wenn du die Messages kriegst, dann wissen wir ob sie generiert werden.

T3rm1n4T0r 21. Sep 2005 13:56

Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
 
Siehe Edit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:36 Uhr.

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