Entwickler-Ecke
Windows API - Mausbewegung global abfangen
Clemens L. - Sa 16.08.08 21:02
Titel: Mausbewegung global abfangen
Hallo mal wieder,
für ein Projekt muss ich jedesmal, wenn sich die Maus irgendwo um einen Bildpunkt bewegt einen Counter hochzählen. Die Forensuche hat mich hierdrauf gestoßen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| var idHook: HHOOK; Counter: integer;
function JournalRecordProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin if nCode = HC_ACTION then if lParam <> 0 then with PEventMsg(lParam)^ do if message = WM_MOUSEMOVE then Inc(Counter); Result := CallNextHookEx(idHook, nCode, wParam, lParam); end;
procedure TMainForm.FormCreate(Sender: TObject); begin idHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalRecordProc, HInstance, 0); end;
procedure TMainForm.FormDestroy(Sender: TObject); begin If idHook <> 0 then begin UnhookWindowsHookEx(idHook); idHook := 0; end; end; |
Das funktioniert soweit auch. Wenn man die Maus allerdings schnell über eine bestimmte Strecke bewegt, werden nur ein Paar Bewegungen registriert. Macht man diese Bewegung langsam, kommen viel mehr Bewegungen an. Da ich aber eine sehr genaue Angabe brauche, die auch bei schnellen Mausbewegungen einwandfrei funktioniert, brauche ich eine neue Lösung. Ich bin auch schon auf den Begriff Mouse-Hook gestoßen, wurde aber nicht ganz schlau daraus.
Ich hoffe jemand kann mir helfen!
Delete - So 17.08.08 18:07
Da wirst du keinen Einflus daruf haben. Windows arbeitet mit Nachrichten und wenn du die Maus schnell bewegst, wird Windows eben nicht genug Nachrichten generieren können, um der Bewegung gerecht zu werden.
Erklär mal, was du eigentlich vorhast bzw. wozu du das so genau brauchst, wahrscheinlich ist dein Ansatz falsch.
Hidden - So 17.08.08 18:15
Merk dir doch einfach die Mausposition und lass die bewegte Strecke in deine Reaktion auf die Mausbewegung einfließen ;)
Clemens L. - So 17.08.08 20:57
Naja, ich muss die Anzahl der Pixel kennen, um die sich die Maus insgesamt seit Programmstart bewegt hat. Wenn ich mir die Mausposition merke und 1 Sekunde danach vergleiche, kann es ja sein dass man nach kurz weit rechts war, dann aber am ende wieder am selben Punkt ist. Also brauche ich die exakte Anzahl. Wenn jemand da eine Lösung hätte, wäre ich sehr dankbar! :)
Hidden - So 17.08.08 21:13
Hi,
Wozu das denn? :shock:^^ das sieht für mich unmöglich aus, da das entweder vom Treiber gefiltert wird(windows nicht mit messages zuspammen^^) oder von der Hardware garnicht erst registriert wird.
Erklär doch mal dein Problem, wir stochern hier gerade ziemlich im Nebel ;)
mfG,
Bergmann89 - Mo 18.08.08 11:09
Kann sein, das er sowas wie ein Maus-Schritt-Zähler bauen will?!
Clemens L. - Mo 18.08.08 15:47
Bergmann89 hat folgendes geschrieben: |
Kann sein, das er sowas wie ein Maus-Schritt-Zähler bauen will?! |
So ungefähr könnte man es nennen. Ich brauche halt den Wert der Maus-Schritte. Diese müssen nicht in Echtzeit vorliegen, es dürfen nur keine Pixel fehlen. Wenn es irgendeine andere Möglichkeit gibt, die bewegten Pixel rauszufinden / auszurechnen, immer her damit! :)
Hidden - Mo 18.08.08 15:54
Hi,
Da wirst du wohl(sag ich jetzt mal so :mrgreen:) so nicht rankommen. Aber, wenn du bei jeder Mausbewegungs-Message die bewegte Strecke in Pixel verwandelst, solltest du eine akzeptable Näherung erhalten.
mfG,
elundril - Mo 18.08.08 16:08
sei damit getröstet das sich jeder darüber freut wieweit er den mauszeiger heute bewegt hat und das sicher nicht auch noch nachzählen wird. ;-)
lg elundril
Clemens L. - Mo 18.08.08 16:15
elundril hat folgendes geschrieben: |
sei damit getröstet das sich jeder darüber freut wieweit er den mauszeiger heute bewegt hat und das sicher nicht auch noch nachzählen wird. ;-)
lg elundril |
Mein Programm muss es aber nachzählen! :P
@Hidden: Das werd ich mal ausprobieren und schauen, wie genau das ist!
Edit:
So, habe jetzt den Vorschlag von hidden nachprogrammiert, und es funktioniert ganz ordentlich.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| var HookHandle: Cardinal = 0; WindowHandle: Cardinal = 0; previousPoint: TPoint; currentDist: Integer = 0; firstRun: Boolean = True;
function DistanceToPoint(p1,p2: TPoint): Integer; begin Result := Round(sqrt(((p1.X-p2.X)*(p1.X-p2.X))+((p1.Y-p2.Y)*(p1.Y-p2.Y)))); end;
function MouseHookProc(nCode: Integer; MsgID: WPARAM; Data: LPARAM):LRESULT; stdcall; label callNext; var currentPoint: TPoint; begin case nCode < 0 of True: Goto CallNext; False: begin If MsgId = WM_MOUSEMOVE then begin currentPoint := PMSLLHOOKSTRUCT(Data)^.pt; If firstRun then begin previousPoint := currentPoint; firstRun := false; goto CallNext; end; Inc(currentDist,DistanceToPoint(previousPoint,currentPoint)); previousPoint := currentPoint; If currentDist mod 5 = 0 then begin PostMessage(WindowHandle,MouseMoveMessage,MsgID,currentDist); currentDist := 0; end; end else If MsgId = WM_LBUTTONDOWN then begin PostMessage(WindowHandle,LeftClickMessage,MsgID,1); end else If MsgID = WM_RBUTTONDOWN then begin PostMessage(WindowHandle,RightClickMessage,MsgID,1); end; end; end; callNext: Result := CallNextHookEx(HookHandle, nCode, MsgId, Data); end; |
So sind die Angaben genau genug. Das ganze wird als WH_MOUSE_LL Hook installiert.
Nochmal danke für die Hilfe :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!