有一个自定义控件放于form上,继承自TComponent,无窗口句柄,内用AllocateHWnd函数动态创建个windowhandl为了可以继承wndproc响应消息时调用DefWindowProc时可以做句柄和作为sendmessage的对象句柄,现在需要sendmessage给他,而且最好带一个数据结构给它,但用wm_copydata过去不会响应,或者说继承的wndproc要么不根本不执行不响应任何信息,要么捕捉不到我发给它的信息要么内存出错,究竟怎么做呢?
调试欢乐多
...
sendmessage(YourHandle,WM_UserDefine,wparam,lparam);至于你说的wm_copydata其实是一个十分特殊的消息,需要注意的是在你想程序发送这个消息前必须激活目标窗口,并且自己编写消息处理函数处理Msg.CopyDataStrucr.lpdata中的数据,其实我觉得这里没必要这么做,你完全可以用一个窗体私有变量来存储你将发送的数据
楼主既然需要句柄,我觉得从TWinControl继承要好些吧
部分代码:控件代码:
type
TXX=class(TComponent)
private
FWindowHandle:HWND;
...
published
property WindowHandle:HWND read FWindowHandle write FWindowHandle default 0;
...
public
procedure WndProc(var Msg:TMessage); overload;
Constructor Create(AOwner:TComponent); override;
Destructor Destroy; override;
end;
procedure Register;
implementation
Constructor TRZ.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FWindowHandle:=AllocateHWnd(WndProc);
...
end;
Destructor TRZ.Destroy;
begin
DeallocateHWnd(FWindowHandle);
...
inherited Destroy;
end;
procedure TRZ.WndProc(var Msg:TMessage);
begin
with Msg do
if (Msg=WM_COPY) and ... then
begin
...
end
else
Result:=DefWindowProc(WindowHandle,Msg,wParam,lParam);
end;
procedure Register;
begin
RegisterComponents('XXX',[XXX]);
end;然后在一个form上放个,然后在form的一个button中SendMessage(XXX1.WindowHandle,WM_COPYDATA,...);
不正常,不知道怎么回事,改来改去有时改成WM_COPY偶尔能正确收到消息,绝大多数是按了半天button都没反应,后来就delphi内存出错甚至delphi重起了...
TWinControl我也试过,也没用或不稳定
如果是procedure TRZ.WndProc(var Msg:TWMCopyData);
AllocateHWnd会出错
if (Msg=WM_COPYDATA) and ... then
begin
...
继承自TWinControl
然后 procedure xxx(var Msg:TMessage);message 8182
从lparam里取得字符串形式的参数
Command:=PString(Msg.lparam)^;
WM_COPYDATA是不必要,至少在这里
SendCommand:='XXXXXXXXXXXXXXXXXXXXXXXXXX';
然后发送SendMessage(xxx1.Handle,8182,0,LPARAM(@SSendCommand));