Autor |
Beitrag |
Clemens L.
      
Beiträge: 158
Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
|
Verfasst: Sa 16.08.08 21:02
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!
_________________ Gruß, Clemens
Vor dem 27.04.08 als "hackerTreff" bekannt!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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 
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Clemens L. 
      
Beiträge: 158
Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
|
Verfasst: 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! 
_________________ Gruß, Clemens
Vor dem 27.04.08 als "hackerTreff" bekannt!
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: So 17.08.08 21:13
Hi,
Wozu das denn?  ^^ 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,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Bergmann89
      
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Mo 18.08.08 11:09
Kann sein, das er sowas wie ein Maus-Schritt-Zähler bauen will?!
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Clemens L. 
      
Beiträge: 158
Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
|
Verfasst: 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! 
_________________ Gruß, Clemens
Vor dem 27.04.08 als "hackerTreff" bekannt!
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Mo 18.08.08 15:54
Hi,
Da wirst du wohl(sag ich jetzt mal so  ) so nicht rankommen. Aber, wenn du bei jeder Mausbewegungs-Message die bewegte Strecke in Pixel verwandelst, solltest du eine akzeptable Näherung erhalten.
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Clemens L. 
      
Beiträge: 158
Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
|
Verfasst: 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!
@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.
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 
_________________ Gruß, Clemens
Vor dem 27.04.08 als "hackerTreff" bekannt!
|
|
|