Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何获取承载COM控件的窗体的句柄_.net_Delphi_Winapi_Com_Sendmessage - Fatal编程技术网

.net 如何获取承载COM控件的窗体的句柄

.net 如何获取承载COM控件的窗体的句柄,.net,delphi,winapi,com,sendmessage,.net,Delphi,Winapi,Com,Sendmessage,我有一个可视化的DotNet控件,在Delphi项目中用作COM控件。 现在,我想获得在DotNet中承载此DotNet组件的delphi表单的句柄。 当然-我可以使用setParentHandleHandle:hwnd之类的东西将表单句柄从Delphi传递到DotNet;方法,但这不是我想要的方法 是否有任何Winapi调用可以为我在DotNet中绘制的组件提供句柄 我想使用此句柄将DotNetComponent本身无法处理的消息发送到Delphi表单。通常,当主机窗口包含可视ActiveX控

我有一个可视化的DotNet控件,在Delphi项目中用作COM控件。 现在,我想获得在DotNet中承载此DotNet组件的delphi表单的句柄。 当然-我可以使用setParentHandleHandle:hwnd之类的东西将表单句柄从Delphi传递到DotNet;方法,但这不是我想要的方法

是否有任何Winapi调用可以为我在DotNet中绘制的组件提供句柄


我想使用此句柄将DotNetComponent本身无法处理的消息发送到Delphi表单。

通常,当主机窗口包含可视ActiveX控件时,主机实现接口并通过其实现将其传递给控件。该控件可以为或查询该IOleClientSite,并调用其GetWindow方法以获取主机的HWND

我不知道IOleObject是如何在.NET层实现的,但这就是COM/ActiveX层的工作方式。因此,.NET控件可能有一种方法来重写它自己的SetClientSite方法,或者提供一些其他方法来访问主机的IOleClientSite接口。

我使用WinApi的方法解决了这个问题,就像在C中这样

[DllImport("user32.dll")]
private static extern IntPtr GetParent(IntPtr hWnd);

protected override void WndProc(ref Message m){

    // 0x20a is the Message constant for WM_MOUSEWHEEL (Scrolling on your control)
    if(m.Msg == 0x20a){
      IntPtr hWnd= GetParent(this.Handle);
      SendMessage(hWnd, m.Msg, m.WParam, m.LParam);
    }
    else
        base.WndProc(ref m);
}

备注:将所有消息转发到父控件将破坏您的控件,因为它将不再接收自己的消息。

能否准确地说明.net代码中的内容。您的.net组件是从哪个类派生的?这是您的Delphi应用程序中托管的组件。dotnet组件基本上是从UserControl派生的。我使用它作为图表组件的容器。但是,我无法访问宿主Delphi表单,实际上我只需要C Code.System.Windows.Forms.UserControl或System.Windows.Controls.UserControl中的句柄?当创建您的图表组件时,它可能会创建自己的窗口,对吗?那么,为什么不简单地检查哪个窗口是您的这个窗口的父窗口呢?但是如果您的组件没有创建自己的窗口呢?然后,必须先将现有窗口的句柄传递给它,以便它知道应该将其内容呈现到哪里。那么就用这个句柄吧。如果你只需要父控件的窗口句柄,你就不能用控件的窗口句柄来调用吗?这个代码会破坏你的控件,因为它不会收到消息。哦,谢谢,你说得对。在我的生产代码中,我先对消息进行预过滤,然后再将它们发送到父控件,例如使用ifm.Msg=0x20a。但是,我需要GetParent方法来获取控件的父窗口的句柄。