将c#windows面板转换为c HWND

时间:2012-12-11 13:40:40

标签: c# hwnd

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

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

我在示例c#.net应用程序中通过在引用中添加dll调用上面的dll,在c#.net中我有一个带有Panel的表单,是否可以将该面板传递给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);

2 个答案:

答案 0 :(得分:4)

你必须小心暴露从根本上非托管类型,如HWND到C#代码。 C#编译器不允许您传递此类型的值。这里适当的互操作类型是IntPtr,它可以存储句柄值。因此,使您的C ++ / CLI方法如下所示:

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

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

答案 1 :(得分:1)

该面板具有您可以使用的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