![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
Unconnected |
![]()
Сообщение
#1
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Привет всем, опять это я и API _)
Нужно мне было сделать глобальную ловушку на мышь. Чтобы какое-то время нигде, кроме окошка моего приложения, клики не имели действия. Решил смастерить сам, залез в MSDN и начал читать про SetWindowhookEx с WH_MOUSE и далее по ссылкам. Я так понял, мне в качестве HookId нужно использовать WH_MOUSE_LL, низкоуровневый перехват, что ли. Сделал такую Callback-функцию: Function pinrct(x,y:integer):boolean; Если я правильно перевёл, то если code будет равно HC_ACTION, то какое-то сообщение пришло. С PostMessage-параметрами там напутано, не пойму, какое сообщение слать, и на закомментированное присвоение Result-у ругается, на первый параметр. В msdn пишут, что он optional и вообще ignored. Я вот чего не пойму, почему везде пишут, что глобальные ловушки должны быть в dll; какая разница-то? И ещё, вот пришло сообщение в мой глобальный хук, если я не вызову настоящий обработчик оператором Inherited, то сообщение дальше не пойдёт? Сообщение отредактировано: Unconnected - 23.06.2010 23:56 -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
Unconnected |
![]()
Сообщение
#2
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
А, вроде чтобы сообщение закончило свои дни в ловушке, надо сделать result:=-1..
-------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
Для начала - о том, почему глобальный (действительно глобальный) хук должен находиться в DLL. А вот почему:
"В Dll код нужно выносить по той простой причине, что этот код должен быть внедрён в адресное пространство целевого процесса. Например, другой процесс, не связанный с вами, ставит хук. Вот вы вызывали GetMessage. Должен сработать хук. Сейчас управление находится в вашем процессе. Как система вызовет обработчик хука, находящийся вообще в другом адресном пространстве? А никак. Поэтому она требует, чтобы код был в DLL. Тогда она может спокойно загрузить DLL в ваш процесс, а когда вы вызываете GetMessage, то система просто проходит по списку хуков и вызывает код каждого обработчика, который сейчас сидит в вашем адресном пространстве. Очень просто." (С) CodeMonkey Кстати, именно по этой причине тебе здесь не нужна DLL: Цитата(MSDN) This hook is called in the context of the thread that installed it. (LowLevelMouseProc Callback Function)Соответственно, чтобы запретить любые действия с мышой за пределами твоего окна, достаточно: var myHook: HHOOK; |
Unconnected |
![]()
Сообщение
#4
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Клааасс, как всегда очень познавательно и понятно, спасибо !
![]() ![]() -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата ну я его просто на число 14 заменил Не надо этого делать... Опиши константуconst , и используй ее... А пользоваться "магическими числами", да еще и при работе с хуками - себе дороже. |
Unconnected |
![]()
Сообщение
#6
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Кстати, если кому интересно, я тут заметил, что не всё подряд перехватывается
![]() function LowLevelMouseProc(nCode: Integer; myWParam: WPARAM; myLParam: LPARAM): LRESULT; stdcall; , позволяет кликнуть правой кнопкой на десктопе, чтобы появилось popup-меню. Наверное, его нельзя перехватывать. И ещё, если привязываться к координатам, то мышь всё равно будет работать, если чужое окно (или кусок того же popup-а) будет поверх моей формы ![]() Сообщение отредактировано: Unconnected - 26.06.2010 23:57 -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата позволяет кликнуть правой кнопкой на десктопе, чтобы появилось popup-меню А, собственно, кто тебе сказал, что меню появляется по WM_RBUTTONDOWN, а не по WM_RBUTTONUP? ![]() |
Unconnected |
![]()
Сообщение
#8
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
И правда, ничего теперь не всплывает, спасибо
![]() -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
![]() ![]() |
![]() |
Текстовая версия | 21.06.2025 17:06 |