Перехват сообщений от мыши
Пишу программу под OС WinXP с использованием MSVS 9. На C/C++ с использованием MFC разумеется ;)
Задача получить сообщений от мыши ( WM_MOUSEMOVE, WM_NCMOUSEMOVE, WM_LBUTTONDBLCLK, WM_LBUTTONDOWN, WM_LBUTTONUP) и и передать их нужной проге немного измененными. С первого взгляда показалось мне простой и даже кое что получилось.
Сначало о том что получилось:
Получилось перехватить сообщения от мыши и все вобщем то работает.
Значит написал я библу
вызываю
(HOOKPROC)msghook, - процедурина обработки сообщений
hInst,- хэндл моей библы
0);
{
if(nCode < 0)
{
CallNextHookEx(hook, nCode, wParam, lParam);
return 0;
}
LPMSG msg = (LPMSG)lParam;
switch(msg->message)
{
case WM_MOUSEMOVE:
case WM_NCMOUSEMOVE:
PostMessage(hWndServer, UWM_MOUSEMOVE, wParam, lParam);
break;
case WM_LBUTTONDBLCLK:
PostMessage(hWndServer, UWM_LBUTTONDBLCLK, wParam, lParam);
break;
case WM_LBUTTONDOWN:
PostMessage(hWndServer, UWM_LBUTTONDOWN, wParam, lParam);
break;
case WM_LBUTTONUP:
PostMessage(hWndServer, UWM_LBUTTONUP, wParam, lParam);
break;
}
return CallNextHookEx(hook, nCode, wParam, lParam);
}
hWndServer - это хендл моей проги где я обрабатываю сообщения
В программе обрабатывающей сообщения я передаю сообщения
PostMessage(MyhWnd, WM_LBUTTONUP, 0, 0 );
Где MyhWnd - это хэндл окна приложения которому я передаю сообщения
Но вот в чем проблема: при получении фокуса прога, которой я должен слать свои сообщения, обрабатывает сообщения и в мою библиотеку ничего не приходит. Думаю у программы есть свой обработчик сообщений. Думаю что есть какая - то цепочка обработчиков сообщений, в которую нужно вклинить свою библиотеку перед перехватчиком сообщений проги.
Подскажите чего нибудь.
Это может быть из-за того что:
1) MyhWnd инициализируется за пределами библиотеки (скорее всего)
2) Приложение-приемник виснет, когда ты включаешь хук (а почему функция ловушки не отфильтровывает окно-приемник? Ведь с него сообщения тоже снимаются!)
3)
Здесь ты пытаешся отфильтровать это окно, но это не то! Твоя ловушка отбрасывает сообщения, посылаемые прогой, за которой ты наблюдаешь, т.е. вот она - причина "почему не виснет" :D
Что-то неправдоподобное - в Windows у всех приложений свои адресные пространства и они могут ссылаться только внутри себя (а библиотека с ловушкой загружается в каждый процесс отдельно, потому и надо все переменные инициализировать внутри библиотеки). Если это хэндл окна, то другой вопрос.
Все примерно так и есть. Устанавливая ловушку, вы "вклиниваетесь" в эту цепочку обработчиков. Подробнее - к Рихтеру.
Уточню:
1. Расположены ли данные, относящиеся к установки ловушки (в частности hInst - хэндл библиотеки), в shared-секции?
2. Зарегистрированы ли сообщения UWM_xxx как глобальные с помощью RegisterWindowMessage()?
3. Кто, собственно, устанавливает ловушку? Какое приложение?
4. Как вы определили, что "все работает"? :)
{
if(hWndServer != NULL)
return FALSE;
hook = SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)msghook,
hInst,
0);
if(hook != NULL)
{
hWndServer = hWnd;
return TRUE;
}
return FALSE;
}
__declspec(dllexport) BOOL clearMyHook(HWND hWnd)
{
if(hWnd != hWndServer || hWnd == NULL)
return FALSE;
BOOL unhooked = UnhookWindowsHookEx(hook);
if(unhooked)
hWndServer = NULL;
return unhooked;
}
#define UWM_LBUTTONDBLCLK_MSG _T("UWM_LBUTTONDBLCLK_MSG-54E531B1_14D3_11d5_A025_006067718D04")
#define UWM_LBUTTONDOWN_MSG _T("UWM_LBUTTONDOWN_MSG-64E531B1_14D3_11d5_A025_006067718D04")
#define UWM_LBUTTONUP_MSG _T("UWM_LBUTTONUP_MSG-74E531B1_14D3_11d5_A025_006067718D04")
UWM_LBUTTONDBLCLK = RegisterWindowMessage(UWM_LBUTTONDBLCLK_MSG);
UWM_LBUTTONDOWN = RegisterWindowMessage(UWM_LBUTTONDOWN_MSG);
UWM_LBUTTONUP = RegisterWindowMessage(UWM_LBUTTONUP_MSG);
С помощью мастера сделал диалог без использования ATL
Хук ставлю функцией в моем диалоговом приложении
Вообще о приложении, которым хочу управлять - это прога использует OpenGl и DirectX при получении фокуса захватывает курсор и не дает ему вылезти за пределы окна в общем как 3d гамеса.
На Notepad и др приложениях тестировал.
Сообщения обрабатываются, но не совсем так ка хочется.
Хочется чтобы я получал сообщение от мыши обрабатывал его не давал дальше обрабатывать др приложениям в том числе и проге, которой хочу управлять, вместо него я хочу посылать собственные измененные сообщения только проге, которой хочу управлять.
Да уже читаю
Но ВЫ всеравно подсказывайте ;)
Просто не вызывайте CallNextHookEx в обработчике ловушки
AFAIK OpenGL никакого интерфейса к клаве\мыши не даёт. у DirectX есть DirectInput - подсистема, которая, насколько я понял, не завязано на WinAPI, а работает ниже её (здесь я могу ошибаться), поэтому совсем не факт, что хуками что-то получиться с этим сделать
Тренеры к играм както ведь пишут;)
мы с друзьями жутко пёрлись одно время с МК4 на компе. но в неё жутко неудобно играть вдвоём на одной клаве, потому что зажимается одновременно куча клавиш и клава просто залипает ) были мысли уже как-то реализовать в ней игру по сети, но тогда ещё не хватило моска, как это сделать :)