| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Поменять местами левую и правую кнопки мыши |
| Автор: Cyclone 21.10.2007, 02:05 | ||
| Привет. Пытаюсь с помощью мышиного (WH_MOUSE) хука поменять местами левую и правую кнопки мыши. Казалось бы, простая задача. Для правой кнопки: Ставлю глобальный хук. В dll'е:
И никакого результата. Компилится, но эффекта нет. В чём я ошибаюсь? |
| Автор: CMD 21.10.2007, 04:01 |
| 1. Для этой задачи есть функция http://msdn2.microsoft.com/en-us/library/ms646264.aspx 2. В приведённом коде ты меняешь только правую кнопку на левую. 3. Если ничего не будет получаться, поставь http://msdn2.microsoft.com/en-us/library/ms645505.aspx`ы, чтобы понять, "работает ли твой хук вообще?". P.S.: Никто не отменял правила хорошего кода: ставь больше пробелов |
| Автор: Cyclone 21.10.2007, 10:31 | ||
|
| Автор: smartov 21.10.2007, 11:05 | ||
| Cyclone, Я конечно системным программированием давно не занимался... Ну для начала несколько глупый вопрос: wParam приходит верный когда правой кнопой клацаешь? Вот кстати тут описка я так понимаю? Ведь не WM_MOUSE а WH_MOUSE И последнее, что меня смущает: может я C недостаточно знаю, но каким образом ты пытаешься менять wParam если это имя входящего параметра. Мне кажется у компилятора тут может быть казус (как часто и бывало кстати) и он передаст в следующий хук не то, что ты попытался в wParam записать, а то, что и пришло в текущий хук. Попробуй переписать типа:
|
| Автор: Cyclone 21.10.2007, 12:28 |
| smartov, с myParam тоже не помогло. ... Хм, только что проверил MessagBox'ом отлов WM_LBUTTONUP - их (сообщений) открывается аж 10 штук на каждый клик. |
| Автор: smartov 21.10.2007, 13:19 |
| Cyclone, значит проблема где-то глубже, и думаю мало кто копал в эту сторону, а просто останавливались на стандартном решении через SwapMouseButtons. Так что наверное придется тебе запастись терпением и в гугль |
| Автор: 586 21.10.2007, 14:08 | ||
Если будешь обрабатывать две кнопки, и ссылаться с левой кнопки на правую, а с правой на левую, то уйдёшь в бесконечный цикл. Где гарантия, что посланное mouse_event() событие не попадёт снова в хук? |
| Автор: dumb 21.10.2007, 15:40 |
| сразу отмечу, что проще использовать WH_MOUSE_LL, где без доп.телодвижений можно узнать о "сгенерированности" эвента(MSLLHOOKSTRUCT.flags & 1). помимо этого, при генерации можно добавлять extrainfo. |
| Автор: Cyclone 22.10.2007, 00:05 |
| Вопрос временно упрощается до "почему при одном нажатии кнопки мыши, выскакивает десяток MessageBox'ов?".. |
| Автор: CMD 22.10.2007, 01:05 | ||
Видимо ты хук коряво поставил, должно быть одно сообщение, когда кнопка нажата, и/или одно - когда отпущена. |
| Автор: smartov 22.10.2007, 11:16 |
| Cyclone, а ты выдели куск с хуками в мелкую прожку, которая бы компилилась и работала, да выложи сырец. Народ глянет - авось на ошибку укажет. |
| Автор: Cyclone 22.10.2007, 20:15 | ||||
Ошибиться-то, кажется, негде... Кстати, хук ставлю из консольного (не распознаёт WH_MOUSE_LL) приложения. В этом могут быть... "подводные камни"? И сама процедура (в .dll) - что-то вроде этого (сейчас речь о простых MessageBox'ах):
|
| Автор: 586 22.10.2007, 20:23 | ||
да. В потоке твоего приложения обязательно должен быть цикл обработки оконных сообщений. |
| Автор: Cyclone 22.10.2007, 20:51 | ||
Эм... я ставлю из консольной программы глобальный хук и проверяю его работу вне консольного окна. Всё равно этот цикл необходим? Можно об этом поподробнее? |
| Автор: ZLon 15.12.2007, 08:51 |
| Я совсем недавно столкнулсо с такой же проблемой. Прога одна задолбала (у неё нажатием на среднюю клавишу мыши делалсо ввод данных), надо было поменять местами среднюю и правую клавиши мыши. Я сначала пробовал как и Cyclone ставить глобальный хук типа WH_MOUSE и в нём редактировать сообщения, но |
| Автор: ZLon 16.12.2007, 22:01 |
| Да, и есчё, по поводу количества сообщений попадающих в ловушку от нажатия или отпускания клавиш: ""Приложение может сколько угодно "смотреть" на сообщение, вызывая функцию PeekMessage с параметром PM_NOREMOVE, но вынуть его сможет один раз"" , - поэтому надо поставить фильтр в функции хука типа (wParam == PM_REMOVE) и при том что последнее истина производить обработку мессаги (подменять одно сообщение другим, в нашем случае) |
| Автор: Andrey44 18.12.2007, 13:56 |
| Посмотрите функцию SystemParametersInfo - должна помочь. |
| Автор: stremers 1.2.2009, 13:07 | ||
|