有一个自定义控件放于form上,继承自TComponent,无窗口句柄,内用AllocateHWnd函数动态创建个windowhandl为了可以继承wndproc响应消息时调用DefWindowProc时可以做句柄和作为sendmessage的对象句柄,现在需要sendmessage给他,而且最好带一个数据结构给它,但用wm_copydata过去不会响应,或者说继承的wndproc要么不根本不执行不响应任何信息,要么捕捉不到我发给它的信息要么内存出错,究竟怎么做呢?

解决方案 »

  1.   

    你写的不是很清楚啊,还是我看的不怎么清楚,我写写常规的方法:procedure xxx(var msg:TMessage);message WM_UserDefine;//你的自定义消息
    ...
    sendmessage(YourHandle,WM_UserDefine,wparam,lparam);至于你说的wm_copydata其实是一个十分特殊的消息,需要注意的是在你想程序发送这个消息前必须激活目标窗口,并且自己编写消息处理函数处理Msg.CopyDataStrucr.lpdata中的数据,其实我觉得这里没必要这么做,你完全可以用一个窗体私有变量来存储你将发送的数据
      

  2.   

    为什么不继承自TWinControl呢?
      

  3.   

    同意楼上的。
    楼主既然需要句柄,我觉得从TWinControl继承要好些吧
      

  4.   

    TWinControl继承的话会多许多不必要的属性很乱,而且拉这个控件到form上就变成一个长宽都为0的黑点,很不爽,更重要的是消息和信息还是传不过去
    部分代码:控件代码:
    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会出错
      

  5.   

    with Msg do
        if (Msg=WM_COPYDATA) and ... then
        begin
          ...
      

  6.   

    继承自WinControl,不再需要你AllocateWnd,你要重载WinControl的WndProc就可以了。
      

  7.   

    已解决&结分
    继承自TWinControl
    然后 procedure xxx(var Msg:TMessage);message 8182
    从lparam里取得字符串形式的参数
    Command:=PString(Msg.lparam)^;
    WM_COPYDATA是不必要,至少在这里
    SendCommand:='XXXXXXXXXXXXXXXXXXXXXXXXXX';
    然后发送SendMessage(xxx1.Handle,8182,0,LPARAM(@SSendCommand));