Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];

Вниз

Перехват WM_LBUTTONDOWN в конкретном приложении   Найти похожие ветки 

 
Nucer   (2008-12-05 13:35) [0]

Есть приложение, которое загружает мою DLL при запуске. Необходимо перехватывать нажатия мыши в этом приложении и если единственное окно в данный момент неактивно (сравнить GetWindowThreadProcessId+GetForegroundWindow с GetCurrentProcessId), то блокировать сообщение (или в крайнем случае закрывать приложение). Как это можно реализовать?

Подойдет ли локальный SetWindowsHookEx c WH_MOUSE? Или для этого надо выполнить SetWindowsHookEx в потоке, обслуживающем то самое конкретное окно? Если ставить глобальный хук, то GetCurrentProcessId будет возвращать pid процесса, получившего сообщение (и невозможно будет получить pid приложения, загрузившего dll)?

Подскажите в какую сторону копать.


 
Сергей М. ©   (2008-12-05 13:45) [1]


> Подойдет ли локальный SetWindowsHookEx c WH_MOUSE?


Подойдет только для мониторинга.
Но есть сомнение, что установка хука будет корректа в контексте выполнения DllMain.


> для этого надо выполнить SetWindowsHookEx в потоке, обслуживающем
> то самое конкретное окно?


Не обязательно.


 
Leonid Troyanovsky ©   (2008-12-05 14:28) [2]


> Сергей М. ©   (05.12.08 13:45) [1]

> > Подойдет ли локальный SetWindowsHookEx c WH_MOUSE?

> Подойдет только для мониторинга.

"Проглотить" может хоть WH_GETMESSAGE.
Ну, или, наверняка, WH_MOUSE_LL.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2008-12-05 14:31) [3]


> Leonid Troyanovsky ©   (05.12.08 14:28) [2]

> > > Подойдет ли локальный SetWindowsHookEx c WH_MOUSE?

Локальный никак не подойдет, sorry.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2008-12-05 14:36) [4]


> Nucer   (05.12.08 13:35)  

> GetCurrentProcessId будет возвращать pid процесса, получившего
> сообщение (и невозможно будет получить pid приложения, загрузившего
> dll)?

Pid легко передать в хуковую функцию в случае WH_GETMESSAGE.
Ну, или, в dwExtraInfo, в случае WH_MOUSE.

--
Regards, LVT.


 
Nucer   (2008-12-05 14:44) [5]

Спасибо за ответы.

Установить локальный Hook в DLLMain получилось. Сообщения перехватываются (если надо, блокирую через HC_SKIP).
hHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, GetCurrentThreadId);

Но основная цель - запретить эмуляцию нажатий в неактивном окне через SendMessage. Так вот почему-то сообщения, отправленные через SendMessage не перехватываются. Почему так происходит и как с этим бороться?


 
Nucer   (2008-12-05 16:25) [6]

Разобрался. Чтобы ловить SendMessage надо ставить хук WH_CALLWNDPROC. А как отловить PostMessage?


 
Leonid Troyanovsky ©   (2008-12-05 16:27) [7]


> Nucer   (05.12.08 14:44) [5]

> Но основная цель - запретить эмуляцию нажатий в неактивном
> окне через SendMessage.

Нажатия эмулируются через Post..Message.

Для того, чтобы влиять на ввод чужих потоков хуком
без использования длл требуется WH_MOUSE_LL hook.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2008-12-05 16:30) [8]


> Nucer   (05.12.08 16:25) [6]

>  А как отловить PostMessage?

WH_GETMESSAGE.

--
Regards, LVT.


 
Nucer   (2008-12-05 16:34) [9]

Спасибо, сделал, все работает.


 
Nucer   (2008-12-06 13:25) [10]

Еще один вопрос. Возможно ли отличить реальное нажатие клавиши от сэмулированного посылкой PostMessage?


 
Rouse_ ©   (2008-12-06 14:14) [11]


> Возможно ли отличить реальное нажатие клавиши от сэмулированного
> посылкой PostMessage?

GetKeyState



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
15-1259923850
Rule
2009-12-04 13:50
2010.02.07
Ищется алгоритм разводки печатных плат


15-1259935064
@!!ex
2009-12-04 16:57
2010.02.07
Как изменить путь к make?


2-1260690327
faiwer
2009-12-13 10:45
2010.02.07
TIniFile && Unicode


15-1259865018
andrewtitoff
2009-12-03 21:30
2010.02.07
Кодировка HTTP запросов


4-1228473351
Nucer
2008-12-05 13:35
2010.02.07
Перехват WM_LBUTTONDOWN в конкретном приложении





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский