Форум » FiveWin » Обработчик событий » Ответить

Обработчик событий

fil: Всем привет ! Можно ли повесить свой обработчик событий на окно внешнего приложения ? События типа мини-максимизировать, закрыть

Ответов - 7

Петр: См. WinAPI SetWindowsHookEx /UnhookWindowsHookEx

fil: Спасибо

fil: HHOOK SetWindowsHookEx ( int idHook, // тип hook-точки, которая устанавливается HOOKPROC lpfn, // адрес подключаемой процедуры HINSTANCE hMod, // дескриптор экземпляра прикладной программы DWORD dwThreadId // идентификация потока, который устанавливает hook-точку ); не могу понять: 1. как нужно описать эту функцию в FWH, смущают параметры lpfn и hMod ? 2. я так понял, что помещать callback ловушку в dll надо только в случае хука для всех потоков всех процессов иначе она в теле проги ? 3. Как получить идентификатор потока конкретного процесса(в данном случае однопоточная аппликация) ?


Петр: 1. Не знаю, я с FWH не работаю. Посмотрите на реализацию ее в библиотеке hbwhat в Harbour (what32 в xHarbour). Можете в принципе использовать эту библиотеку. Я в подобном случае пользовался бы C и писал функцию-переходник для Harbour без передачи всяких параметров - параметры в С функции и обработчик тоже на C, но тут я думаю каждый волен решать как ему будет лучше. 2. Из описания HOOKPROC lpfn - указывает на подключаемую процедуру. Если параметр dwThreadId нулевой или он определяет идентификатор потока, созданного другим процессом, параметр lpfn должен указывать на фильтр - процедуру в динамически компонуемой библиотеке (DLL). Иначе, lpfn может указывать на подключаемую процедуру в коде, связанном с текущим процессом. Т.е. два случая когда мы должны запихивать ловушку в dll - dwThreadId = 0 (делаем системный хук) или dwThreadId создается другим процессом ( ИМХО ваш случай). 3. В принципе можно установить dwThreadId = 0 и сделать хук глобальным(системным), что не рекомендуется или воспользоваться GetWindowThreadProcessId, если у вас есть дескриптор окна с которым надо поработать.

Петр: Вроде бы так (не тестировал!) [pre2]#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[/pre2] Осталось написать MyHookProc и откомпилировать myhook.dll (на С конечно же)

fil: Н-да, все непросто. Похоже надо ловить события WH_MOUSE и WH_KEYBOARD. Спасибо, однако. Думать буду

fil: Не буду возиться с хуками, а сделаю все через GetAsyncKey



полная версия страницы