Ich habe ein kleines Python-Skript, das Statistiken über meine Tastatur und Maus Verwendung auf einem Windows-Rechner sammelt.Detect SetWindowsHookExA WH_MOUSE_LL Trennen/Unhooking
Ich habe es über windll.user32.SetWindowsHookExA(win32con.WH_MOUSE_LL, mouse_pointer, win32api.GetModuleHandle(None), 0)
eingerichtet. Ich schreibe das, damit Sie sehen können, welche API ich verwende. Es könnte genauso gut ein C++ Programm gewesen sein.
Es funktioniert vollkommen gut, mit einer Ausnahme: Wenn ich Android Studio verwenden, um eine App zu kompilieren, mein Core i7 mit 4 Kernen maximiert bei 100% auf allen Kernen, reagiert die Maus und das Betriebssystem im Allgemeinen nicht mehr ein bekanntes Problem mit Android Studio.
Normalerweise, wenn eine solche sehr hohe CPU-Last für ein paar Sekunden (4+) auftritt, wird der WH_MOUSE_LL-Hook vom Betriebssystem getrennt, als würde er sagen "Nein, wir haben keine Zeit für Sie, wir" re enfernen Sie“
ich das nicht auf Python Schuld, weil ich auch ein Lautstärke-Manager PowerMixer genannt haben, die offenbar auch eine Maus-Hook registriert, so dass er Mausrad Aktionen auf der unteren Taskleiste verfolgen können (Explorer .exe Shell_TrayWnd) und diese Anwendung verliert auch die Fähigkeit, diesen Maus-Hook nach dem Kompilieren zu verwenden.
Wenn ich das Scrollrad kompiliere und ständig scrolle (nur zum Spaß), fängt der Computer an zu piepsen, wie in einem sehr niedrigen Systempiepston und dann werden auch die Tastatur-Hooks nicht registriert.
Wie kann ich über die Windows API erkennen, ob meine Haken gelöst/ausgehakt wurden? Ich benötige keine Python-spezifische Antwort, nur Informationen zur richtigen Verwendung des Win32-APIs.
Der Bemerkungen Abschnitt des SetWindowsHookEx documentation sagt:
Wenn die Hook-Prozedur abläuft, das System die Nachricht an den nächsten Haken geht. Unter Windows 7 und späteren Versionen wird der Hook jedoch unbeaufsichtigt entfernt, ohne dass er aufgerufen wird. Es gibt keine Möglichkeit für die Anwendung wissen, ob der Haken entfernt ist.
Bin ich kein Glück hier?
Update: Ein paar Wochen später möchte ich nur informieren, dass Hans Passan Vorschlag sehr gut funktioniert. Ich empfehle das. Während 10.000 ms ein bisschen hoch erscheinen, habe ich es auf diesen Wert eingestellt und habe keine negativen Auswirkungen. Dies ist der Weg, das Problem systemweit innerhalb weniger Minuten zu lösen.
Erhöhen Sie einfach das Timeout, es ist Registrierungseinstellung. Fügen Sie dem Schlüssel HKEY_CURRENT_USER \ Control Panel \ Desktop den Wert LowLevelHooksTimeout, ein DWORD, hinzu. Setzen Sie es auf 10000, um das Zeitlimit zu verdoppeln. –
* "Ich mache das nicht auf Python aus, weil ich auch [ein anderes Programm, das unter denselben Bedingungen dasselbe Verhalten zeigt, die gleiche Bibliothek benutzen]" *. - Das scheint ziemlich ergebnislos zu sein, und ich würde nichts als Quelle mit dieser kleinen Information verwerfen. Ziehen Sie einen Minidump sowohl von Android Studio als auch von Ihrem Python-Skript, wenn sie fehlschlagen, und analysieren Sie sie später. Dies kann interessante Informationen preisgeben. – IInspectable
@Intensiv Sie können Recht haben. Aber das Debuggen dieses Problems ist mir die Zeit und Mühe nicht wert. Es war eine schnelle Entscheidung aufgrund der Tatsache, dass dieser Sound-Manager, den ich erwähne, auch das gleiche Problem hat und dass man definitiv nicht in Python geschrieben ist. –