借助win32 API将K模式的IE合并到WPF窗体中。
使用反射设置IE以K模式展示;使用反射的前提是了解IE对外暴露的接口,参考 https://msdn.microsoft.com/en-us/library/aa752084(v=vs.85).aspx
创建K模式IE代码:

1 //获取IE实例类型 2 System.Type oType =System.Type.GetTypeFromProgID("InternetExplorer.Application"); 3 4 //创建IE实例 5 object IEType = System.Activator.CreateInstance(oType); 6 7 //获取IE的所有暴露的接口 8 IEType.GetType().GetMembers(); 9 10 //隐藏菜单 11 IEType.GetType().InvokeMember("menubar",System.Reflection.BindingFlags.SetProperty, null, IEType, new object[] { false}); 12 13 //隐藏工具条 14 IEType.GetType().InvokeMember("toolbar",System.Reflection.BindingFlags.SetProperty, null, IEType, new object[] { false}); 15 16 //隐藏状态条 17 IEType.GetType().InvokeMember("statusBar",System.Reflection.BindingFlags.SetProperty, null, IEType, new object[] { false}); 18 19 //隐藏地址栏 20 IEType.GetType().InvokeMember("addressbar",System.Reflection.BindingFlags.SetProperty, null, IEType, new object[] { false}; 21 22 //IE窗体可见 23 IEType.GetType().InvokeMember("Visible",System.Reflection.BindingFlags.SetProperty, null, IEType, new object[] { true}); 24 25 //全屏显示 26 IEType.GetType().InvokeMember("FullScreen",System.Reflection.BindingFlags.SetProperty, null, IEType, new object[] { true}); 27 28 //导航到指定URL 29 IEType.GetType().InvokeMember("Navigate", System.Reflection.BindingFlags.InvokeMethod, null, reflectionObj, new object[] { "www.baidu.com" });
通过Win32API获取IE句柄,然后调用API将子窗体附件到父窗体
在WPF中获取窗体句柄的方式为:IntPtr hwnd = ((HwndSource)PresentationSource.FromVisual(你要获取的窗体的对象)).Handle;
代码如下:
1 ///获取IE句柄 2 [DllImport("USER32.DLL")] 3 public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 4 5 ///将子窗体附加到父窗体上 6 [DllImport("USER32.DLL")] 7 public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 8 9 //获取WPF窗体句柄,获取成功为非0值 10 IntPtr Wpf_hwnd = ((HwndSource)PresentationSource.FromVisual(窗体实例)).Handle; 11 12 //获取IE句柄,获取成功为非0值 13 IntPtr IE_hwnd = FindWindow("ieframe", null) 14 15 //将IE附加到WPF窗体上 16 SetParent(IE_hwnd,Wpf_hwnd);
用反射创建的IE,在关闭WPF窗体的时候,并不会被关闭,即使是使用Process.kill()杀进程的方法,也无法关闭IE界面,无法终止进程。
照成这个现象的原因是因为使用了非托管的com对象(就是IE),所以在关闭的时候要先调用System.Runtime.InteropServices.Marshal.ReleaseComObject()来释放该IE对象(原因请参考CLR调用非托管对象),然后调用Kill方法杀死IE进程。
Process proc = Process.GetProcessById(反射创建的IE的进程ID); if (IEType != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(IEType); proc.Kill(); proc.Close();