Ich habe einen globalen Haken für WM_MOUSE definiert, der seit einiger Zeit perfekt funktioniert. Es post eine Nachricht an ein bestimmtes Fenster jedes Mal die Maus bewegen.
Nach einer zufälligen Zeit hört der Haken auf, Nachrichten zu senden. Wenn ich die Registrierung aufhebe und den Hook wieder registriere, funktioniert er wieder. Ich vermute, dass irgendetwas Bestimmtes in Windows passiert, was den Hook zum Anhalten bringt, aber ich kann nicht herausfinden, was.
Irgendwelche Ideen?
bearbeiten : Ich habe einen Debugger an andere Prozesse angeschlossen, wenn der Hook nicht mehr aktiv ist, und ich habe festgestellt, dass die DLL nicht mehr geladen wird.
Was könnte dazu führen, dass eine Hook-DLL entladen wird?
Bearbeiten2 : Ich habe herausgefunden, dass ein Absturz der MouseHookProc dll in einem beliebigen Prozess die Hook dll von jedem Prozess, in dem sie geladen ist, entlädt. Ich kann keine Ursache für einen Absturz in meinem Code finden. Könnte es eine Race Condition oder etwas anderes sein? Hier ist der Code der Hook-Dll:
#include "stdafx.h"
// define a data segment
#pragma data_seg(".SHARED")
HWND hwnd=0;
HHOOK hHook=0;
#pragma data_seg()
// tell the linker to share the segment
#pragma comment(linker, "/section:.SHARED,RWS")
#define WM_MOUSEHOOK WM_USER+0x100
HINSTANCE hInstance=0;
// this allow to build a very small executable without any extra libraries
// (probably not the problem, the bug still occurs without this )
#ifndef _DEBUG
void *__cdecl operator new(unsigned int bytes)
{
return HeapAlloc(GetProcessHeap(), 0, bytes);
}
void __cdecl operator delete(void *ptr)
{
if(ptr) HeapFree(GetProcessHeap(), 0, ptr);
}
extern "C" int __cdecl __purecall(void)
{
return 0;
}
#endif
BOOL APIENTRY DllMain( HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
hInstance=hModule;
return TRUE;
}
LRESULT CALLBACK MouseHookProc(int nCode, WORD wParam, DWORD lParam)
{
if(nCode==HC_ACTION && (wParam==WM_MOUSEMOVE || wParam==WM_NCMOUSEMOVE))
{
MSLLHOOKSTRUCT *mhs=(MSLLHOOKSTRUCT*)lParam;
PostMessage(hwnd, WM_MOUSEHOOK, wParam, 0);
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}
extern "C" __declspec(dllexport) HHOOK InitializeWindowsHook(char *title)
{
hwnd=FindWindow(0, title);
if(hwnd)
hHook=SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc, hInstance, 0);
return hHook;
}
extern "C" __declspec(dllexport) BOOL DeinitializeWindowsHook()
{
if(hHook) {
BOOL b=UnhookWindowsHookEx(hHook);
hHook=0;
return b;
}
return FALSE;
}
0 Stimmen
Werden die Meldungen an andere Hooks in der Kette weitergegeben?
0 Stimmen
Mir ist aufgefallen, dass Sie zwar eine
WH_MOUSE
Haken verwenden SieMSLLHOOKSTRUCT
anstelle vonMOUSEHOOKSTRUCT
Struktur.0 Stimmen
Eigentlich erklären Sie
*mhs
aber Sie benutzen es nicht.0 Stimmen
Ja, ich habe auch LL-Haken ausprobiert. Ich wollte den Code nicht zu sehr verändern, aus Angst, etwas zu entfernen, das für den Fehler von Bedeutung ist. Natürlich ist mhs nutzlos, aber ich kann nicht sehen, wie es einen Absturz oder ein Fehlverhalten verursachen könnte.
0 Stimmen
Arbeiten Sie mit Windows 7? Ich habe diesen Thread gefunden: social.msdn.microsoft.com/Forums/de/ in dem ein ähnliches Thema behandelt wird. Ich habe das gleiche Problem selbst; wenn die CPU beschäftigt ist, der Haken (offenbar) Zeiten aus und wird nie wieder aufgerufen.
0 Stimmen
Hallo, wir sind auf das gleiche Problem gestoßen, allerdings mit LL-Tastaturhaken. Haben Sie eine Lösung für dieses Problem gefunden?
0 Stimmen
Wir haben festgestellt, dass die Werte in dem gemeinsamen Segment, das in anderen Prozessen geladen wurde, nicht die richtigen Werte waren. Es waren Werte aus einem vorhergehenden Start. Die Ursache scheint der Absturz unserer ausführbaren Datei zu sein, gefolgt von ihrem sofortigen Neuladen durch den Watchdog (die Hook-DLL sollte entladen und dann neu geladen werden, aber das geschieht nicht. Wir sind uns nicht sicher, warum, aber die Geschwindigkeit des Nachladens scheint der Übeltäter zu sein. )