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 Mausradrichtung bei Journalhook ermitteln (https://www.delphipraxis.net/95344-mausradrichtung-bei-journalhook-ermitteln.html)

Hedge 5. Jul 2007 11:12


Mausradrichtung bei Journalhook ermitteln
 
Habe einen JournalHook eingrichtet und es funktioniert auch alles super...

Delphi-Quellcode:
function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  If nCode = HC_ACTION then
   begin
    If lParam <> 0 then with PEventMsg(lParam)^ do
     begin
      If Message = WM_MOUSEWHEEL then
       begin
        Inc(Form1.i);
        Form1.Label1.Caption := IntToStr(Form1.i);
       end;
     end;
   end;
  Result := CallNextHookEx(Form1.MouseHook, nCode, wParam, lParam);
end;
Das einzige Problem das ich habe ist, dass ich es nicht schaffe zu ermitteln in welche Richtung sich das Mausrad dreht.


Delphi-Quellcode:
WM_MOUSEWHEEL
  fwKeys = LOWORD(wParam);
  zDelta = HIWORD(wParam);
  xPos = LOWORD(lParam);
  yPos = HIWORD(lParam);
laut Definition müsste dies aber eigentlich mit zDelta möglich sein..wie ermittel ich nun diesen Parameter in der oben genannten Funktion. Hab schon ziemlich lange rumprobiert aber nichts funktionierte.

Robert Marquardt 5. Jul 2007 11:31

Re: Mausradrichtung bei Journalhook ermitteln
 
Ich habe mal das with beseitigt, denn es ist hier unpraktisch.
Delphi-Quellcode:
function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  P: PEventMsg;
  Delta: Smallint;
begin
  If nCode = HC_ACTION then
   begin
    If lParam <> 0 then
     begin
      P := PEventMsg(lParam);
      If P^.Message = WM_MOUSEWHEEL then
       begin
        // HIWORD extrahiert ein WORD das man zu einem Smallintumtypen muss, damit das Vorzeichen wieder auswertbar wird.
        Delta := Smallint(HIWORD(P^.wParam));
        Inc(Form1.i);
        Form1.Label1.Caption := IntToStr(Form1.i);
       end;
     end;
   end;
  Result := CallNextHookEx(Form1.MouseHook, nCode, wParam, lParam);
end;

Mazel 5. Jul 2007 11:40

Re: Mausradrichtung bei Journalhook ermitteln
 
Ziwschenfrage: Warum ist es mit with in diesem Fall unpraktisch? Ich habe den Code jetzt mal bei mir in ein Programm eingebaut aber es geht nicht weil P^.wParam nicht existiert.

Robert Marquardt 5. Jul 2007 11:49

Re: Mausradrichtung bei Journalhook ermitteln
 
Versehen meinerseits. Ich dachte die Elemente von TEventMsg hiessen auch lParam und wParam. Das gaebe dann Probleme mit dem Verstaendnis welches lParam gemeint ist.
Probier mal P^.paramH. Es scheint so zu sein das in diesen Records lParam vor wParam steht. Wenns das nicht war, dann P^.paramL probieren.

Hedge 5. Jul 2007 11:50

Re: Mausradrichtung bei Journalhook ermitteln
 
hab das selbe Problem denn bei

Delphi-Quellcode:
Delta := Smallint(HIWORD(P^.wParam));
tritt ein Fehler auf:

Undeclared identifier: 'wParam'

bei P^.paramH schmiert das Programm komplett ab

Mazel 5. Jul 2007 12:22

Re: Mausradrichtung bei Journalhook ermitteln
 
Leider funktioniert es weder mit paramH und paramL.

Robert Marquardt 5. Jul 2007 12:24

Re: Mausradrichtung bei Journalhook ermitteln
 
Was steht denn in paramH und paramL? "Schmiert ab" und "funktionert nicht" sind keine Fehlerbeschreibungen.

Mazel 5. Jul 2007 13:05

Re: Mausradrichtung bei Journalhook ermitteln
 
Ich erhalte bei dem Code bei beiden 0. Ohne LOWORD und HIWORD wird die Position des Mauszeigers zurückgegeben: paramH die Top-Position und paramL die Left-Position.

SirThornberry 5. Jul 2007 13:10

Re: Mausradrichtung bei Journalhook ermitteln
 
habt ihr mal im msdn geschaut (bzw. allgemein in der Hilfe)?
Da steht
Zitat:

wParam
The high-order word indicates the distance the wheel is rotated, expressed in multiples or divisions of WHEEL_DELTA, which is 120. A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user.
bei normalem auswerten der Message (ohne hook) funktioniert das (wie von robert auch bereits beschrieben).

Hedge 5. Jul 2007 16:41

Re: Mausradrichtung bei Journalhook ermitteln
 
An dem Abschmieren war ich selbst schuld denn in dem Hook sollte man kein ShowMessage benutzen...

@SirThornberry: was meinst du mit normalem Auswerten der Message?

bei:
Delphi-Quellcode:
if P^.Message = WM_MOUSEWHEEL then
       begin
         Delta := Smallint(HIWORD(P^.paramL));
         MainForm.Label1.Caption := IntToStr(Delta);
       end;
wird stets 0 ausgegeben (bei paramL und paramH)

Hedge 6. Jul 2007 18:02

Re: Mausradrichtung bei Journalhook ermitteln
 
bump!

Komme nicht auf die Lösung des Problems :(

mleyen 16. Jun 2008 08:13

Re: Mausradrichtung bei Journalhook ermitteln
 
So, ich weiß das Thema ist wiedereinmal alt, aber ich stehe vor dem selben Problem.

Jedoch habe ich jetzt folgenden Kommentar in einem Quelltext dazu gefunden:
Delphi-Quellcode:
{
  The lParam parameter contains a pointer to a TEventMsg
  structure containing information on
  the message removed from the system message queue.
}
Ich weiß genau, dass es da drinsteht, nur wie wandel ich jetzt den "lParam"-Pointer in das nötige TEventMsg um bzw. wie komme ich da dran?

müsste das nicht so aussehen:
" TEventMsg(@(EventStrut.paramL) " ?
Ich hoffe ihr könnt mir helfen, danke schonmal. :dp:

Edit:
Habe nochwas in der Hilfe gefunden: GET_WHEEL_DELTA_WPARAM(wParam) die Funktion finde ich jedoch nicht in Delphi.

Edit2: Ok: Mit journalproc kann man anscheinend nicht herausfinden ob das Rad hoch oder runtergedreht wurde. hier hat es einer auch ausführlich versucht und ist nachher anscheinend auf irgendeinen "WH_MOUSE_LL hook" umgestiegen.
Nunja, schu ich mir den halt an...


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