Автор | Сообщение |
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 06.11.08 19:48. Заголовок: Обработчик событий
Всем привет ! Можно ли повесить свой обработчик событий на окно внешнего приложения ? События типа мини-максимизировать, закрыть
|
|
|
Ответов - 7
[только новые]
|
|
|
| постоянный участник
|
Пост N: 580
Зарегистрирован: 09.10.06
|
|
Отправлено: 06.11.08 23:14. Заголовок: См. WinAPI SetWindow..
См. WinAPI SetWindowsHookEx /UnhookWindowsHookEx
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 07.11.08 01:18. Заголовок: Спасибо..
Спасибо
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 08.11.08 12:25. Заголовок: HHOOK SetWindowsHook..
HHOOK SetWindowsHookEx ( int idHook, // тип hook-точки, которая устанавливается HOOKPROC lpfn, // адрес подключаемой процедуры HINSTANCE hMod, // дескриптор экземпляра прикладной программы DWORD dwThreadId // идентификация потока, который устанавливает hook-точку ); не могу понять: 1. как нужно описать эту функцию в FWH, смущают параметры lpfn и hMod ? 2. я так понял, что помещать callback ловушку в dll надо только в случае хука для всех потоков всех процессов иначе она в теле проги ? 3. Как получить идентификатор потока конкретного процесса(в данном случае однопоточная аппликация) ?
|
|
|
|
| постоянный участник
|
Пост N: 582
Зарегистрирован: 09.10.06
|
|
Отправлено: 08.11.08 14:57. Заголовок: 1. Не знаю, я с FWH ..
1. Не знаю, я с FWH не работаю. Посмотрите на реализацию ее в библиотеке hbwhat в Harbour (what32 в xHarbour). Можете в принципе использовать эту библиотеку. Я в подобном случае пользовался бы C и писал функцию-переходник для Harbour без передачи всяких параметров - параметры в С функции и обработчик тоже на C, но тут я думаю каждый волен решать как ему будет лучше. 2. Из описания HOOKPROC lpfn - указывает на подключаемую процедуру. Если параметр dwThreadId нулевой или он определяет идентификатор потока, созданного другим процессом, параметр lpfn должен указывать на фильтр - процедуру в динамически компонуемой библиотеке (DLL). Иначе, lpfn может указывать на подключаемую процедуру в коде, связанном с текущим процессом. Т.е. два случая когда мы должны запихивать ловушку в dll - dwThreadId = 0 (делаем системный хук) или dwThreadId создается другим процессом ( ИМХО ваш случай). 3. В принципе можно установить dwThreadId = 0 и сделать хук глобальным(системным), что не рекомендуется или воспользоваться GetWindowThreadProcessId, если у вас есть дескриптор окна с которым надо поработать.
|
|
|
|
| постоянный участник
|
Пост N: 583
Зарегистрирован: 09.10.06
|
|
Отправлено: 08.11.08 16:35. Заголовок: Вроде бы так (не тес..
Вроде бы так (не тестировал!) цитата: | #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #include "hbapiitm.h" static HINSTANCE s_hDll = NULL; static HOOKPROC s_hookproc = NULL; static HHOOK s_hook = NULL; HB_FUNC( MYHOOKPROCINSTALL ) // MyHookProcInstall( hWnd ) -> TRUE .or. FALSE { HWND hWnd = (HWND) hb_parnl(1); if ( IsWindow(hWnd) && ((s_hDll = LoadLibrary((LPCTSTR)"myhook.dll")) != NULL) ) { if ( (s_hookproc = (HOOKPROC) GetProcAddress(s_hDll, (LPCTSTR)"MyHookProc")) == NULL ) s_hook = NULL, hb_retl( FALSE ); else hb_retl( (s_hook = SetWindowsHookEx(WH_CALLWNDPROC, s_hookproc, s_hDll, GetWindowThreadProcessId(hWnd, NULL))) == NULL ? FALSE : TRUE ); if ( s_hook == NULL ) FreeLibrary( s_hDll ); } } HB_FUNC( MYHOOKPROCUNINSTALL ) // MyHookProcUnInstall() { if ( s_hook != NULL ) UnhookWindowsHookEx( s_hook ), s_hook = NULL, FreeLibrary( s_hDll ); } #pragma ENDDUMP |
| Осталось написать MyHookProc и откомпилировать myhook.dll (на С конечно же)
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 08.11.08 18:43. Заголовок: Н-да, все непросто. ..
Н-да, все непросто. Похоже надо ловить события WH_MOUSE и WH_KEYBOARD. Спасибо, однако. Думать буду
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 08.11.08 20:05. Заголовок: Не буду возиться с х..
Не буду возиться с хуками, а сделаю все через GetAsyncKey
|
|
|
|