Я определил глобальную ловушку для WM_MOUSE, которая какое-то время отлично работает. Он отправляет сообщение в определенное окно при каждом движении мыши.
Через некоторое время ловушка перестает отправлять сообщения. Если я отменю регистрацию и зарегистрирую хук, он снова заработает. Я предполагаю, что какая-то конкретная вещь, происходящая в Windows, заставляет ловушку останавливаться, но я не могу найти что.
Любые идеи ?
Изменить: я подключил отладчик к другим процессам, когда ловушка больше не активна, и заметил, что dll больше не загружается.
Что могло вызвать выгрузку хука dll?
Edit2: я обнаружил, что сбой в MouseHookProc dll в любом процессе выгружает 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;
}
WH_MOUSE
хук, вы используетеMSLLHOOKSTRUCT
вместо структурыMOUSEHOOKSTRUCT
. - person Nick Dandoulakis   schedule 09.10.2009*mhs
, но не используете его. - person Nick Dandoulakis   schedule 09.10.2009