IE浏览器合并到WPF窗体中

    借助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" });
View Code

 

 通过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();

 

posted @ 2015-11-20 15:32  Maculish  阅读(625)  评论(1编辑  收藏  举报