Op maandag 25 maart 2002 15:06 schreef Kool het volgende:
In principe wil ik eigenlijk alleen de messages voor het Owner Form van het component vangen. Ik vrees namelijk dat je bij bovengenoemde stukken code alle messages van alle forms v.d. applicatie ontvangt???
Hmm, ik denk eigenlijk dat die nieuw gecreeerde HWnd alleen messages ontvangt die expliciet naar die HWnd gestuurd zijn. Dus in het geheel geen messages gestuurd naar het form of andere forms van die applicatie.
Ik heb nog wat code gevonden, die doet meer een 'hook' in de Message handler van het form:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| constructor TMyComp.Create;
begin
//...
if not (csDesigning in ComponentState) then
begin
// Hook the application
OldFormProc := Pointer(GetWindowLong(TForm(Owner).Handle, GWL_WNDPROC));
NewFormProc := MakeObjectInstance(HookFormProc);
SetWindowLong(TForm(Owner).Handle, GWL_WNDPROC, LongInt(NewFormProc));
end;
end;
procedure TMyComp.HookFormProc(var Message: TMessage);
begin
with Message do
begin
case Msg of
WM_SIZE:
if wParam = SIZE_MINIMIZED then
begin
// form is geminimaliseerd
end;
end;
// niet vergeten
Result := CallWindowProc(OldFormProc, TForm(Owner).Handle, Msg, wParam, lParam);
end;
end; |
Dit werkt natuurlijk alleen als de owner van het component een form is...
O ja vergeet het unhooken niet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| destructor TMyComp.Destroy;
begin
if not (csDesigning in ComponentState) then
begin
if Assigned(OldFormProc) then
SetWindowLong(TForm(Owner).Handle, GWL_WNDPROC, LongInt(OldFormProc));
if Assigned(NewFormProc) then
FreeObjectInstance(NewFormProc);
NewFormProc := nil;
OldFormProc := nil;
end;
//... |