//функция устанавливающая ловушку на события мыши
HOOKPROC MouseHook(int nCode,WPARAM w_param,LPARAM l_param)
{
mouse_data=(MOUSEHOOKSTRUCT*)(l_param);
HWND par_win=mouse_data->hwnd;//дескриптор окна над которым находится мыша
HWND main_wind=FindWindow("main_win",NULL);//ищем окно, загрузившее нашу dll с ловушкой
switch(w_param)
{
case WM_MBUTTONDBLCLK://событие мыши, которое нам надо отследить.
//тут наш код-обработчик этого события
//например посылаем некое сообщение программе загрузившей dll
PostMessage(main_wind, ХХХ, (WPARAM)par_win, (LPARAM)mouse_data->hwnd);
return 0;
}
return 0;
}
Обработка сообщений мыши
Каким образом можно отследить события мыши в WindowsXP (нажатие кнопок, перемещение курсора и его координаты на дисплее)?
Цитата:
Originally posted by Chinchipos
Каким образом можно отследить события мыши в WindowsXP (нажатие кнопок, перемещение курсора и его координаты на дисплее)?
Каким образом можно отследить события мыши в WindowsXP (нажатие кнопок, перемещение курсора и его координаты на дисплее)?
Смотри в сторону системных глобальных ловушек, динамических библиотек и функции SetWindowsHookEx(...).
Можно даже пример.
Код ловушки в DLL:
Код:
Теперь - код для главной программы:
Код:
HINSTANCE h_lib=LoadLibrary("hook_dll.dll");
if(!h_lib)
{
ER_MSG("Не удалось загрузить библиотеку");
return 0;
}
//устанавливаем ловушку на события мыши
HOOKPROC pMouseHook=(HOOKPROC)MouseHook;
if(!pMouseHook)//проверка удачности получения указателя на функцию ловушки
{
MessageBox(0,"Не удалось получить адрес функции ловушки",0,MB_ICONERROR);
return 1;
}
//собственно устанавливаем ловушку
HHOOK hMouseHook=SetWindowsHookEx(WH_MOUSE, (HOOKPROC)(pMouseHook), h_lib,0);
if(!hMouseHook)
{
MessageBox(0,"Не удалось установить ловушку для мыши!",0,MB_ICONERROR);
return 2;
}
if(!h_lib)
{
ER_MSG("Не удалось загрузить библиотеку");
return 0;
}
//устанавливаем ловушку на события мыши
HOOKPROC pMouseHook=(HOOKPROC)MouseHook;
if(!pMouseHook)//проверка удачности получения указателя на функцию ловушки
{
MessageBox(0,"Не удалось получить адрес функции ловушки",0,MB_ICONERROR);
return 1;
}
//собственно устанавливаем ловушку
HHOOK hMouseHook=SetWindowsHookEx(WH_MOUSE, (HOOKPROC)(pMouseHook), h_lib,0);
if(!hMouseHook)
{
MessageBox(0,"Не удалось установить ловушку для мыши!",0,MB_ICONERROR);
return 2;
}
В данном случае используется статическое связывание dll и exe, функия LoadLibrary применена исключительно для получения дескриптора экземпляра библиотеки применяемого в функции SetWindowHookEx(...). Потом библиотеку обязательно нужно будет освободить при помощи FreeLibrary(...).
См. статическое/динамическое связывание.
ЗЫ Если хочешь что бы в системе на 100% корректно работали все мышиные хуки, а не только твой, то фукнцию ловушки надо доделать. За этим см. сюда.