![]() |
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? |
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. |
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. |
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. |
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. |
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. |
Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
Zitat:
|
Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
Also ist es nicht möglich, so einen Mausklick abzufangen?
|
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. |
Re: Wie kann ich Maustaste 4 und 5 abfangen und darauf reagi
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 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