【问题标题】:Convert c# windows panel to c HWND将 c# windows 面板转换为 c HWND
【发布时间】:2012-12-11 13:40:39
【问题描述】:

我有一个接受 HWND 的 dll, (dll中的代码);

void VideoCapture::SetVideoWindow(HWND VidWind)
{
    VideoWindow = VidWind;
}

我通过在引用中添加 dll 在示例 c#.net 应用程序中调用上述 dll,在 c#.net 中我有一个带有面板的表单,是否可以将该面板传递给 dll? 我在c#中给出了如下代码

VidCapWrapper.ManagedVideoCapture cc = new VidCapWrapper.ManagedVideoCapture();

cc.SetVideoWindow( panel1);

我收到如下错误: '错误 2'VidCapWrapper.ManagedVideoCapture.SetVideoWindow(HWND__)' 的最佳重载方法匹配有一些无效参数 D:\DirectShow_Capture_GUI\DirectShow_Capture_GUI\Form1.cs 44 13 DirectShow_Capture_GUI 错误 3 参数 1:无法从 'System.Windows.Forms.Panel' 转换为 'HWND__' D:\DirectShow_Capture_GUI\DirectShow_Capture_GUI\Form1.cs 44 32 DirectShow_Capture_GUI`

谁能告诉我如何将面板传递给 dll,(任何例子都会很好)? (对不起,我对 .net 很陌生,但正在尝试创建一个示例应用程序来显示可用设备,如集成网络摄像头......然后在 c#.net 表单面板上显示预览)

编辑: 感谢@Blachshma 和@Hans Passant,现在我可以将 c# windows 窗体的面板传递给我的 c++ dll。

我将 dll 中的 func 更改为

void VideoCapture::SetVideoWindow(IntPtr windowHandle)
{
    VideoWindow = (HWND)windowHandle.ToPointer();
}

在 c# 中我将其称为 cc.SetVideoWindow(panel1.Handle);

【问题讨论】:

  • 这是一个 WinForms 应用程序吗?
  • 检查它是否具有 Handle 属性(很可能是 IntPtr)。
  • @ShivaKumar 只是对本网站的一个提示(我认为这是您的第一个问题),当您向某人发表评论时,您需要在某人的姓名前加上一个 @ 符号显示你在他们的收件箱中提到了他们。这有例外,但这是一般情况。
  • @Scott Chamberlain,好的,从现在开始我会这样做

标签: c# hwnd


【解决方案1】:

您必须小心不要将像 HWND 这样的基本非托管类型暴露给 C# 代码。 C# 编译器不允许您传递这种类型的值。这里正确的互操作类型是 IntPtr,它可以存储句柄值。所以让你的 C++/CLI 方法看起来像这样:

void VideoCapture::SetVideoWindow(IntPtr windowHandle)
{
    VideoWindow = (HWND)windowHandle.ToPointer();
}

您现在可以简单地将 panel1.Handle 传递给方法,也是 IntPtr 类型。

【讨论】:

  • 谢谢@Hans Passant,我可以将 c# 表单面板传递给 c++ dll。
【解决方案2】:

该面板有一个Handle 可以使用的属性:

Panel p = new Panel();
IntPtr handle = p.Handle;

如果您将SetVideoWindow 签名设置为允许IntPtr 即,这就足够了

void VideoCapture::SetVideoWindow(IntPtr VidWind)

如果您必须使用 HWND,则需要使用 unsafe 上下文,并像这样进行转换:

HWND hwnd=(HWND)this.Handle.ToPointer();

这里是link,提供更多信息

【讨论】:

  • 感谢@Blachshma 的回复,我可以将面板传递给c++dll。
猜你喜欢
  • 2013-11-05
  • 1970-01-01
  • 2014-03-02
  • 2017-12-17
  • 2012-12-29
  • 2011-05-03
  • 2023-01-03
  • 2019-11-06
  • 2012-01-29
相关资源
最近更新 更多