![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
Cyclone |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 2.5.2007 Репутация: нет Всего: нет |
Привет.
Пытаюсь с помощью мышиного (WH_MOUSE) хука поменять местами левую и правую кнопки мыши. Казалось бы, простая задача. Для правой кнопки: Ставлю глобальный хук. В dll'е:
И никакого результата. Компилится, но эффекта нет. В чём я ошибаюсь? Это сообщение отредактировал(а) Cyclone - 21.10.2007, 12:01 |
|||
|
||||
CMD |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 1.8.2006 Репутация: 1 Всего: 1 |
1. Для этой задачи есть функция SwapMouseButton()
2. В приведённом коде ты меняешь только правую кнопку на левую. 3. Если ничего не будет получаться, поставь MessageBox`ы, чтобы понять, "работает ли твой хук вообще?". P.S.: Никто не отменял правила хорошего кода: ставь больше пробелов |
|||
|
||||
Cyclone |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 2.5.2007 Репутация: нет Всего: нет |
|
|||
|
||||
smartov |
|
|||
![]() свой собственный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: нет Всего: 259 |
Cyclone,
Я конечно системным программированием давно не занимался... Ну для начала несколько глупый вопрос: wParam приходит верный когда правой кнопой клацаешь? Вот кстати тут описка я так понимаю? Ведь не WM_MOUSE а WH_MOUSE И последнее, что меня смущает: может я C недостаточно знаю, но каким образом ты пытаешься менять wParam если это имя входящего параметра. Мне кажется у компилятора тут может быть казус (как часто и бывало кстати) и он передаст в следующий хук не то, что ты попытался в wParam записать, а то, что и пришло в текущий хук. Попробуй переписать типа:
|
|||
|
||||
Cyclone |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 2.5.2007 Репутация: нет Всего: нет |
smartov, с myParam тоже не помогло.
... Хм, только что проверил MessagBox'ом отлов WM_LBUTTONUP - их (сообщений) открывается аж 10 штук на каждый клик. ![]() |
|||
|
||||
smartov |
|
|||
![]() свой собственный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: нет Всего: 259 |
Cyclone, значит проблема где-то глубже, и думаю мало кто копал в эту сторону, а просто останавливались на стандартном решении через SwapMouseButtons. Так что наверное придется тебе запастись терпением и в гугль
![]() |
|||
|
||||
dumb |
|
||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 27 Всего: 158 |
т.е. нужно сгенерировать новое событие(mouse_event()) и вернуть из обработчика ненулевое значение. вызывать другие обработчики при этом не нужно. |
||||
|
|||||
586 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
Если будешь обрабатывать две кнопки, и ссылаться с левой кнопки на правую, а с правой на левую, то уйдёшь в бесконечный цикл. Где гарантия, что посланное mouse_event() событие не попадёт снова в хук? Это сообщение отредактировал(а) 586 - 21.10.2007, 14:12 |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 27 Всего: 158 |
сразу отмечу, что проще использовать WH_MOUSE_LL, где без доп.телодвижений можно узнать о "сгенерированности" эвента(MSLLHOOKSTRUCT.flags & 1).
помимо этого, при генерации можно добавлять extrainfo. |
|||
|
||||
Cyclone |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 2.5.2007 Репутация: нет Всего: нет |
Вопрос временно упрощается до "почему при одном нажатии кнопки мыши, выскакивает десяток MessageBox'ов?"..
|
|||
|
||||
CMD |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 1.8.2006 Репутация: 1 Всего: 1 |
Видимо ты хук коряво поставил, должно быть одно сообщение, когда кнопка нажата, и/или одно - когда отпущена. |
|||
|
||||
smartov |
|
|||
![]() свой собственный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: нет Всего: 259 |
Cyclone, а ты выдели куск с хуками в мелкую прожку, которая бы компилилась и работала, да выложи сырец. Народ глянет - авось на ошибку укажет.
|
|||
|
||||
Cyclone |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 2.5.2007 Репутация: нет Всего: нет |
Ошибиться-то, кажется, негде... Кстати, хук ставлю из консольного (не распознаёт WH_MOUSE_LL) приложения. В этом могут быть... "подводные камни"? И сама процедура (в .dll) - что-то вроде этого (сейчас речь о простых MessageBox'ах):
Это сообщение отредактировал(а) Cyclone - 22.10.2007, 20:19 |
||||
|
|||||
586 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
||||
|
||||
Cyclone |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 2.5.2007 Репутация: нет Всего: нет |
Эм... я ставлю из консольной программы глобальный хук и проверяю его работу вне консольного окна. Всё равно этот цикл необходим? Можно об этом поподробнее? |
|||
|
||||
ZLon |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.5.2007 Репутация: нет Всего: 3 |
Я совсем недавно столкнулсо с такой же проблемой.
Прога одна задолбала (у неё нажатием на среднюю клавишу мыши делалсо ввод данных), надо было поменять местами среднюю и правую клавиши мыши. Я сначала пробовал как и Cyclone ставить глобальный хук типа WH_MOUSE и в нём редактировать сообщения, но ![]() |
|||
|
||||
ZLon |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 5.5.2007 Репутация: нет Всего: 3 |
Да, и есчё, по поводу количества сообщений попадающих в ловушку от нажатия или отпускания клавиш:
""Приложение может сколько угодно "смотреть" на сообщение, вызывая функцию PeekMessage с параметром PM_NOREMOVE, но вынуть его сможет один раз"" , - поэтому надо поставить фильтр в функции хука типа (wParam == PM_REMOVE) и при том что последнее истина производить обработку мессаги (подменять одно сообщение другим, в нашем случае) |
|||
|
||||
Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
Посмотрите функцию SystemParametersInfo - должна помочь.
-------------------- ????? ??, ??????? ?????. ![]() |
|||
|
||||
stremers |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 28.11.2006 Репутация: нет Всего: нет |
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |