我在WM_MOUSE上定義了一個全局鉤子,它可以在一段時間內完美工作。每次鼠標移動時,它都會將消息發佈到特定的窗口。SetWindowsHook在一段時間後停止工作
經過一些隨機時間後,掛鉤停止發送消息。如果我取消註冊並註冊掛鉤,它會再次運行。我想在Windows中發生的一些具體事情會導致掛鉤停止,但我找不到。
任何想法?
編輯:當鉤子不再活躍時,我將調試器附加到其他進程,並且我觀察到dll不再被加載。
什麼可能導致掛鉤dll卸載?
編輯2:我發現在MouseHookProc中發生了崩潰,在任何進程中的dll都會從它加載的每個進程中卸載hook dll。我無法找到導致代碼崩潰的原因。可能是一些競爭條件或什麼?這裏是鉤子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;
}
你是否將消息傳播給鏈中的其他鉤子? – rpg 2009-10-05 12:19:12
我注意到,雖然你有'WH_MOUSE'掛鉤,你可以使用'MSLLHOOKSTRUCT'而不是'MOUSEHOOKSTRUCT'結構。 – 2009-10-08 21:37:30
其實你聲明'* mhs',但你不使用它。 – 2009-10-08 21:41:21