Maushook aus FAQ buggy ?
-
Folgende Probleme:
- UnhookWindowsHookEx hat nicht zur Folge, dass die HHook Variable NULL wird, ist ja auch kein Pointer, aber in SetHook() wird abgefragt, ob HHOOK Null ist und gibt, wenn nicht, ein "Hook ist schon gesetzt" aus, egal ob RemoveHook() benutzt wurde.
Das hat der Autor nicht bedacht.das müsste eigentlich noch hinzugefügt werden:
(ghHook = NULL),oder man ändert die Abfrage.- Bei dem Auftreten einer egal wie gearteten Exception ist es unmöglich die Maus zu benutzen und nach 5 sec ist es dann ganz aus, die Programme reagieren gar nicht mehr auf irgendwelche Eingabemedien.
- Bei Simulation eines Mausdrucks, passiert nichts (?)(bin nicht sicher, was da los war ist, kann auch das Ändern der Mausposition sein, ich bin da nicht ganz sicher, ich mach beides nacheinander.)
Das ist in meinem Prog, eigentlich nichts groß geändert zur FAQ.
void __fastcall TMM5::wmMessage(TMessage& msg) { if (!DisableHook) { MouseX = GetMouseData().pt.x; MouseY = GetMouseData().pt.y; BUTTON = (int)msg.WParam; if (BUTTON == WM_LBUTTONUP && !Locked && !reenable->Enabled) { MChange(); reenable->Enabled = true; } } }
dann sollte noch eine Abfrage eingebaut werden, ob die Maustasten vertauscht sind. Denn der Hook fängt AFAIK nur die Physischen Tasten der Maus.
Das wird im FAQ Eintrag soweit ich weiß nicht erwähnt.Ich mach noch kurz zwei Änderungen, dann meld ich mich wieder, ob die Besserung bringen. (in der DLL)
Hier das dritte Problem: Der erste Mausclick wird nicht simuliert, die maus ist zwar an der richtigen stelle, aber nichts passiert. MANUELLES KLICKEN GEHT AUCH NICHT. (wegen Sleep nehm ich an, immer wenn das Programm "hängt", macht die Maus nix mehr und der ganze PC hängt, das ist sehr gefährlich)
Mouse->CursorPos = TPoint(200+ClientPos->Left,665+ClientPos->Top); Sleep(100); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); int Timeout = 0; c = GetPixel(hdc, ClientPos->Left + 420, ClientPos->Top + 223); while (!(57 == GetRValue(c) && 8 == GetGValue(c) && 0 == GetBValue(c))) { c = GetPixel(hdc, ClientPos->Left + 420, ClientPos->Top + 223); Timeout += 50; Sleep(50); if (Timeout >= 2500) { Label1->Caption = ("Timeout"); //goto JUMPOUT; } } Mouse->CursorPos = TPoint(585+ClientPos->Left,563+ClientPos->Top); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
-
ghHook nu nullen hat die Lösung gebracht, ich unhooke vor dem Simulieren und hooke erst, wenn ich wirklich aufzeichnen muss.
Ich bitte dennoch um erleuchtende Worte.
EDIT: Noch eine Frage:
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) { if( nCode >= 0 && ghHook) // Wieso hat das hinzugefügte ghHook hier den interessanten Effekt, dass die Fkt nur noch Mausaktionen auf dem Programm mit der eingebundenen DLL protokolliert ? { MOUSEHOOKSTRUCT mhs = *(MOUSEHOOKSTRUCT*)lParam; pHookStruct->MouseHookStruct = mhs; LONG lPoint = MAKELONG((WORD)mhs.pt.x, (WORD)mhs.pt.y); SendMessage(pHookStruct->hwnd, WM_MOUSEHOOK, wParam, (LPARAM)lPoint); } return CallNextHookEx(ghHook, nCode, wParam, lParam); }