AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Wie kann ich Maustaste 4 und 5 abfangen und darauf reagieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie kann ich Maustaste 4 und 5 abfangen und darauf reagieren

Ein Thema von T3rm1n4T0r · begonnen am 19. Sep 2005 · letzter Beitrag vom 21. Sep 2005
Antwort Antwort
Seite 2 von 3     12 3      
T3rm1n4T0r

Registriert seit: 10. Sep 2004
38 Beiträge
 
Turbo Delphi für Win32
 
#11

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

  Alt 20. Sep 2005, 19:02
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?
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#12

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

  Alt 21. Sep 2005, 04:55
Was soll der ganze Murks? WM_XBUTTONDBLCLK, WM_XBUTTONDOWN, WM_XBUTTONUP.
WM_APPCOMMAND ist auch noch interessant, da dort die ganzen Multimediatasten gemeldet werden.
  Mit Zitat antworten Zitat
T3rm1n4T0r

Registriert seit: 10. Sep 2004
38 Beiträge
 
Turbo Delphi für Win32
 
#13

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

  Alt 21. Sep 2005, 11:42
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.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#14

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

  Alt 21. Sep 2005, 11:51
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.
  Mit Zitat antworten Zitat
T3rm1n4T0r

Registriert seit: 10. Sep 2004
38 Beiträge
 
Turbo Delphi für Win32
 
#15

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

  Alt 21. Sep 2005, 11:55
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.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#16

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

  Alt 21. Sep 2005, 12:04
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.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#17

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

  Alt 21. Sep 2005, 12:04
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...
  Mit Zitat antworten Zitat
T3rm1n4T0r

Registriert seit: 10. Sep 2004
38 Beiträge
 
Turbo Delphi für Win32
 
#18

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

  Alt 21. Sep 2005, 12:06
Also ist es nicht möglich, so einen Mausklick abzufangen?
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#19

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

  Alt 21. Sep 2005, 12:06
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.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#20

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

  Alt 21. Sep 2005, 12:08
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:27 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