【问题标题】:How to call native code which draw in WPF Image from C# code?如何从 C# 代码调用在 WPF Image 中绘制的本机代码?
【发布时间】:2011-09-30 13:11:06
【问题描述】:

我有一个包含在 C# 代码中的本机库(没有可用的资源)。

存在以下 C# 声明:

[DllImport(DRIVER_DLL_NAME, 
 CallingConvention = CallingConvention.Cdecl, 
 EntryPoint = "RenderBitmap")]
private static extern int RenderBitmap(int hWnd);

我需要从我的 WPF C# 项目中调用此函数。

我有一个适用于 Windows 窗体的示例代码:

System.Windows.Forms.PictureBox DisplayWindow;
...
RenderBitmap(DisplayWindow.Handle.ToInt32());

我还没有找到如何使用 WPF System.Windows.Controls.Image 而不是 System.Windows.Forms.PictureBox - 没有 Handle 属性或类似的东西。

此外,我在"WPF and Win32 Interoperation" 中发现了以下语句: “当您创建 WPF 窗口时,WPF 会创建一个顶级 HWND,并使用 HwndSource 将 Window 及其 WPF 内容放入 HWND。应用程序中的其余 WPF 内容共享该单一 HWND。” Image 似乎根本不存在 HWND 句柄。

如何从 C# 代码调用在 WPF Image 中绘制的原生代码?

【问题讨论】:

    标签: c# wpf interop


    【解决方案1】:

    WPF 控件没有 WinForms 中的句柄。只能访问主窗口句柄:

    例如,在主窗口类中(或使用Application.Current.MainWindow):

     var handle = (new WindowInteropHelper(this)).Handle;
     var hwnd = HwndSource.FromHwnd(handle);
    

    看来您必须考虑另一种方法而不是本机调用。

    顺便说一句,为什么需要这么低级的绘图功能?我只是可以假设您只是想重用已经为 WinForms 实现的一个。也许您可以使用内置的 WPF 功能实现相同的目的。

    【讨论】:

    • 我的原生库是摄像头驱动。并且有来自供应商的 C# 示例 - 围绕本机代码的包装器,但示例使用了 WindowsForms。我的应用程序使用 WPF。
    • 我相信我明白了,您基本上想为 WPF 编写自己的包装器。不幸的是,WPF 完全是另一个演示框架,也是您已经观察到的最显着的差异之一 - 没有像 WinForms 中的每个控件的 HWND/Window
    • @sergdev - 解决方案是将 System.Controls.Image 放置在 Win32 窗体中,并将​​窗体放置在窗口中。此解决方案的替代方法是联系供应商并寻求支持。
    • @Ramhound 它应该可以工作,但看起来很奇怪 :) 联系供应商的好主意
    • @sergdev - 如果您想要另一个替代方案,您必须向我们提供相关库的名称。他们使用句柄似乎很奇怪,这是一种返回图像的奇怪方式,你甚至可能不需要一个句柄。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多