On-line: Haz, гостей 0. Всего: 1 [подробнее..]
АвторСообщение



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 06.11.08 19:48. Заголовок: Обработчик событий


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

Спасибо: 0 
Цитата Ответить
Ответов - 7 [только новые]


постоянный участник


Пост N: 580
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 06.11.08 23:14. Заголовок: См. WinAPI SetWindow..


См. WinAPI SetWindowsHookEx /UnhookWindowsHookEx

Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 07.11.08 01:18. Заголовок: Спасибо..


Спасибо

Спасибо: 0 
Цитата Ответить



Не зарегистрирован
Зарегистрирован: 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. Как получить идентификатор потока конкретного процесса(в данном случае однопоточная аппликация) ?

Спасибо: 0 
Цитата Ответить
постоянный участник


Пост 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, если у вас есть дескриптор окна с которым надо поработать.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост 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 (на С конечно же)


Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 08.11.08 18:43. Заголовок: Н-да, все непросто. ..


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

Спасибо: 0 
Цитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 08.11.08 20:05. Заголовок: Не буду возиться с х..


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

Спасибо: 0 
Цитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 393
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет