Делаю глобальный хук на нажатие правой кнопки мыши. Код в DLL выглядит так:
//...
#pragma data_seg(".SHARDATA")
static HHOOK hHook = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.SHARDATA,rws")
long CALLBACK myHook(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode<0) return CallNextHookEx(hHook,nCode,wParam,lParam);
switch (wParam) {
case WM_RBUTTONDOWN:
MessageBox(0,"Mouse event","",0);
return TRUE;
};
return FALSE;
};
void InitDll(void) {
hHook = SetWindowsHookEx(WH_MOUSE,myHook,hDllInstance,0);
};
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) {
if (ul_reason_for_call==DLL_PROCESS_ATTACH) hDllInstance = (HINSTANCE)hModule;
return TRUE;
};
Загружаю DLL в основной программе по WM_CREATE:
case WM_CREATE:
hLib=LoadLibrary("myHook.dll");
myHookInit = (pfMyHookInit)GetProcAddress(hLib,"InitDll");
myHookInit();
Теперь грабли: запускаю прогу, нажимаю правую кнопку мыши — появляется сообщение "Mouse event", нажимаю Enter или мышью "Ok" в сообщении — появляется ещё одно такое же, закрываю и это — вылезает ещё, и таких — от 12 до 22 штук на каждое нажатие мыши. Количество сообщений на одно нажатие не зависит от количества запущенных программ, а зависит от того, какое окно под курсором мыши (что странно).
Пробовал выводить инфу в MessageBox(), получается, что все сообщения, генерящиеся на одно и то же нажатие мыши, получают абсолютно идентичные данные через nCode, wParam, lParam. Через lParam передаётся указатель на структуру MOUSEHOOKSTRUCT, данные в структуре идентичны, но указатель (значение lParam) меняется. Я так понимаю, что это — вызовы хука в контексте каждой задачи (может, я неправ?).
Вопрос: что нужно подправить, чтобы хук вызывался один раз на одно нажатие? Событие само по себе не нужно, может, его из очереди как-то удалять?