WPF中嵌入第三方窗体-WindowsFormsHost使用

嵌入第三方窗体到Windows 窗体或控件中,通过调用API方法很容易实现,但是在WPF 存在一些问题,这里对解决这些问题的方法做一点笔记:

命名空间:System.Windows.Forms.Integration
程序集: WindowsFormsIntegration.dll
一个元素,它允许在WPF页上托管Windows窗体控件

  • 首先说一下要做嵌入第三方窗体要用到的API方法
[DllImport("user32.dll",SetlastError=true)]
private static extern IntPtr SetParent(IntPtr hWndChild,IntPtr hWndParent); 
//该方法时嵌入第三方窗体的关键
//hWndChild:要嵌入对象的句柄   hWndParent:嵌入到的容器的句柄
[DllImport("user32.dll",SetLastError=true)]
private static extern bool MoveWindow(IntPtr hWnd,int X,int Y,int nHeight,int nWidth);
//移动窗体到指定的位置
[DllImport("user32.dll",EntryPoint="GetWindowLong")]
private static extern int GetWindowLong(IntPtr hWnd,int nIndex);
[DllImport("user32.dll",EntryPoint="SetWindowLong")]
private static extern int SetWindowLong(IntPtr hWnd,int nIndex,int dwNewLong);

private const int GWL_Style=-16;
private const int WS_CAPTION=0xC00000;
private const int WS_CHILD=0x40000000;
private const int WS_VISIBLE=0x1000000;
  • 通过以上API方法,可以看出要用到要嵌入的对象和嵌入的目标容器的句柄,在WPF 中智能获取窗体的句柄,无法获取控件的句柄,因此要实现以上功能,就需要解决这个问题。

  • 解决方法,在WPF 中加入Windows.Forms 控件
    要在WPF中使用Windows.Forms 控件,需要引用如下程序集:

1. WindowsFormsIntegration
2. System.Windows.Forms
在XAML中引入:
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

  • 使用方法,即把 作为容器,其中可以放置Windows.Forms 的控件,例如:
<WindowsFormsHost>
   <wf:DataGridView x:Name="datagridview1" /> 
</WindowsFormsHost>

这样就可以轻松获取控件的句柄

IntPtr h=datagridview1.Handle
posted @ 2024-12-03 14:27  丹心石  阅读(72)  评论(0编辑  收藏  举报