如何调用从C#代码中绘制WPF图像的本机代码?
问题描述:
我有一个本地库(没有可用的源代码)包装成C#代码。如何调用从C#代码中绘制WPF图像的本机代码?
下面的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把窗口和WPF内容HWND内的其余部分。你的WPF内容在应用程序中共享单一的HWND。“。 似乎HWND手柄根本不存在Image
。
如何调用从C#代码中绘制WPF图像的本机代码?
答
WPF控件没有类似于WinForms的句柄。只有主窗口句柄是访问:
例如,在主窗口类(或使用Application.Current.MainWindow
):
var handle = (new WindowInteropHelper(this)).Handle;
var hwnd = HwndSource.FromHwnd(handle);
所以看起来你已经考虑另一种方法,而不是本地调用。
顺便说一句,为什么你需要这样一个低级别的绘图功能?我可以假设你只是想重用已经实现的WinForms。也许你可以使用内置的WPF功能来实现相同的功能。
我的本机库是相机的驱动程序。还有来自供应商的C#示例 - 围绕本机代码封装,但示例使用WindowsForms。我的应用程序使用WPF。 – sergtk
我相信我明白了,你基本上想为WPF编写自己的包装器。不幸的是,WPF完全是另一个表示框架,并且您已经观察到了最显着的差异之一 - 对于每个控件,没有HWND/Window,如WinForms – sll
@sergdev - 解决方案是将System.Controls.Image放入一个Win32窗体并将该窗体放置在一个窗口中。此解决方案的替代方法是联系供应商并寻求支持。 –