使用sendmessage()或postmessage()向控件发送消息时, 需要指定对应的句柄,而非可视控件继承于 TComponent 没有 Handle,所以一般非可视控件都不能接受外部发来的消息.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
为了让非可视控件能够接受消息,首先想到的就是给其加上句柄.
在查阅资料后,发现 Classes 里有两个个函数 AllocateHWnd(Method: TWndMethod): HWND; 和 DeallocateHWnd(Wnd: HWND) 顾名思义 一个是分配 Handle 一个是释放 Handle。
程序代码简单如下:
Type
TMyObject = class(TComponent)
private
FWindowHandle: HWND;
Protected
procedure WndProc(var Msg: TMessage);
public
constructor Create(AOwner: TComponent); override;
destructor Destry;override;
property Handle: HWND read FWindowHandle;
end;
procedure Register;
implementation
procedure Register;
begin
.....
end;
constructor TMyObject.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FWindowHandle := AllocateHWnd(WndProc);
end;
destructor TMyObject.Destry;
begin
DeallocateHWnd(FWindowHandle);
inherited Destroy;
end;
{ 每个有Handle的控件都有这个段过程 }
procedure TMyObject.WndProc(var Msg: TMessage);
begin
with Msg do
begin
case Msg of
//自己的处理消息的过程.....
else
Result := DefWindowProc(FWindowHandle, Msg, WParam, LParam);
end;
end;
end;
向此控件发送消息时,跟从 TWinControl继承下来的控件一样的使用
PostMessage(MyObject.Handle, ..., ..., ...);
就可以了。