Autor Beitrag
Clemens L.
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 158

Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
BeitragVerfasst: 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:

ausblenden 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 158

Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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,

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
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)
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 158

Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
BeitragVerfasst: Mo 18.08.08 15:47 
user profile iconBergmann89 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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,

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 158

Win Xp SP3
D6 Enterprise, Turbo Delphi Explorer
BeitragVerfasst: Mo 18.08.08 16:15 
user profile iconelundril 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.

ausblenden volle Höhe 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 :)

_________________
Gruß, Clemens
Vor dem 27.04.08 als "hackerTreff" bekannt!