嵌入第三方窗体到Windows 窗体或控件中,通过调用API方法很容易实现,但是在WPF 存在一些问题,这里对解决这些问题的方法做一点笔记:
- 首先说一下要做嵌入第三方窗体要用到的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
标签:IntPtr,WindowsFormsHost,嵌入,int,private,Windows,窗体,WPF
From: https://www.cnblogs.com/sundh1981/p/18584007