Делаю глобальный хук на нажатие правой кнопки мыши. Код в 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) меняется. Я так понимаю, что это — вызовы хука в контексте каждой задачи (может, я неправ?).
Вопрос: что нужно подправить, чтобы хук вызывался один раз на одно нажатие? Событие само по себе не нужно, может, его из очереди как-то удалять?
Читаем MSDN, например, WM_RBUTTONDOWN:
Return Values
If an application processes this message, it should return zero.
Может в этом дело.
Здравствуйте, Вадим Никулин, Вы писали:
ВН>Читаем 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.
Но, видимо, что-то я всё-таки делаю не так...
BH>Вопрос: что нужно подправить, чтобы хук вызывался один раз на одно нажатие? Событие само по себе не нужно, может, его из очереди как-то удалять?
Можешь попробовать удалить из очереди при помощи PeekMessage
... << RSDN@Home 1.0 beta 6a >>