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

Вопрос: что нужно подправить, чтобы хук вызывался один раз на одно нажатие? Событие само по себе не нужно, может, его из очереди как-то удалять?
Re: Глобальный хук на мышь - "множественная" реакция
От: Вадим Никулин Россия Здесь
Дата: 27.04.03 18:41
Оценка:
Читаем MSDN, например, WM_RBUTTONDOWN:

Return Values
If an application processes this message, it should return zero.

Может в этом дело.
Re[2]: Глобальный хук на мышь - "множественная" реакция
От: BlockHead  
Дата: 27.04.03 19:21
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:

ВН>Читаем MSDN, например, WM_RBUTTONDOWN:

ВН>Return Values
ВН>If an application processes this message, it should return zero.

Это верно при обработке сообщения в функции окна, а про хук сказано другое:
(см. MouseProc)
Return Values
To enable the system to process the message, the return value must be zero. To discard the message, the return value must be a nonzero value.

ИМХО я делаю так, как велено: если происходит WM_RBUTTONDOWN, показываю MessageBox и возвращаю TRUE (to discard the message), а на все остальные сообщения возвращаю FALSE.

Но, видимо, что-то я всё-таки делаю не так...
Re: Глобальный хук на мышь - "множественная" реакция
От: Exception Беларусь  
Дата: 27.04.03 20:24
Оценка:
BH>Вопрос: что нужно подправить, чтобы хук вызывался один раз на одно нажатие? Событие само по себе не нужно, может, его из очереди как-то удалять?

Можешь попробовать удалить из очереди при помощи PeekMessage
... << RSDN@Home 1.0 beta 6a >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.