Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

локальный хук из своего компонента


Diamond Cat ©   (2002-10-11 00:59:00) 

в созданом компоненте ставлю локальный хук, но что-то видимо не так так как программа умирает
вот примерный код

unit mycomponent;

interface

uses
///
type
Tmycomponent = class (TCustomControl)
protected
function MouseProc(Code, W,l : Integer): LongInt;
end;

implementation
var
HookHandle: HHOOK = 0;

constructor Tmycomponent.Create (AOwner: TComponent);
begin
inherited Create (AOwner);
end;

function tmycomponentr.MouseProc(Code, W,l : Integer): LongInt;
var
j,i:integer;
begin
if Code =HC_ACTION
then
begin
///// допустим ничего не делаем
end ;
Result :=CallNextHookEx(HookHandle, Code, W,L ); программа дохнет тут
end;

procedure Tmycomponent.CreateHandle;
var
HRegion1: THandle;
begin
inherited;
HRegion1 := CreatePolygonRgn (Pts,
sizeof (Pts) div 8, winding);
SetWindowRgn (Handle, HRegion1, True);
HookHandle := SetWindowsHookEx(WH_Mouse,@tmycomponent.MouseProc,0,GetCurrentThreadid);
end;

destructor Tmycomponent.Destroy;
begin
UnHookWindowsHookEx(HookHandle);
end;
end.

в чем проблема?


Cobalt   (2002-10-16 13:37:00) [1]

> Diamond Cat © (14.10.02 23:53
Нужен ли тебе именно компонент ?
Если да, то надо организовывать список компонент(своих), устанавливаешь св-ва, права и очередь получения информации от одного хука(его ставит самый первый компонент, которому надо, остальные проверяют, установлен хук уже, или нет).
В общем, возьми бумагу, ручку, и рисуй схему взаимодействия хука, компонент и всего прочего.


Diamond Cat   (2002-10-14 23:53:00) [2]

с этим я уже и сам разобрался теперь борюсь с тем, чтоб передать из MouseProc управление процедуре описанной в public, пока ничего умнее чем sendmessage не придумал, а грабли в том, что приходится хендл экземпляра компонента запихивать в глобальную переменную, соответственно сообщение получает только последний экземпляр, кто-нить может посоветовать более путевый подход?


Cobalt   (2002-10-14 11:18:00) [3]

Слона-то никто и не заметил ;)
HookHandle := SetWindowsHookEx(WH_Mouse, @tmycomponent.MouseProc, 0, GetCurrentThreadid);
Процедура, передаваемая хуку, не должна быть методом класса!(ИМХО)


Diamond Cat   (2002-10-11 23:11:00) [4]

не заметил там примера с локальным хуком


Song   (2002-10-11 22:31:00) [5]

В статьях про хук отлично работающие примеры. Лучше разбирайте их.


Diamond Cat   (2002-10-11 22:29:00) [6]

2 vidivспасибо конечно за совет но мне не нужен чужой компонент

2 Rouse_не понятно как это может повлиять на результат (собственно и не повлияло) :о)

2 Songрезультат все равно плачевный

блин что-же делать, пойду разбирать на запчасти TRxWindowHook :-)


Song   (2002-10-11 09:14:00) [7]

Вызов call-back ф-ии хука должен быть stdcall !!!


Rouse_   (2002-10-11 06:37:00) [8]

W и L сделай Longint, мож отпустит ;)


vidiv   (2002-10-11 06:23:00) [9]

Пользуйся: TRxWindowHook!!!, Для локальных хуков


Наверх

Титульная страница Поиск, карта сайта Написать письмо