Глобальный хук на мышь - "множественная" реакция
От: BlockHead  
Дата: 27.04.03 18:01
Оценка:
Делаю глобальный хук на нажатие правой кнопки мыши. Код в 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) меняется. Я так понимаю, что это — вызовы хука в контексте каждой задачи (может, я неправ?).

Вопрос: что нужно подправить, чтобы хук вызывался один раз на одно нажатие? Событие само по себе не нужно, может, его из очереди как-то удалять?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.