IE浏览器合并到WPF窗体中,借助win32 API将K模式的IE合并到WPF窗体中

借助win32 API将K模式的IE合并到WPF窗体中。

 使用反射设置IE以K模式展示;使用反射的前提是了解IE对外暴露的接口,参考        https://msdn.microsoft.com/en-us/library/aa752084(v=vs.85).aspx

创建K模式IE代码:

 //获取IE实例类型 
       System.Type oType =System.Type.GetTypeFromProgID("InternetExplorer.Application");
          
         //创建IE实例
         object IEType = System.Activator.CreateInstance(oType);
          
         //获取IE的所有暴露的接口
         IEType.GetType().GetMembers();
     
        //隐藏菜单
        IEType.GetType().InvokeMember("menubar",System.Reflection.BindingFlags.SetProperty, null, IEType, new object[] { false}); 
        
        //隐藏工具条                    
        IEType.GetType().InvokeMember("toolbar",System.Reflection.BindingFlags.SetProperty, null, IEType, new object[] { false});
   
        //隐藏状态条         
        IEType.GetType().InvokeMember("statusBar",System.Reflection.BindingFlags.SetProperty, null, IEType, new object[] { false});
   
        //隐藏地址栏          
        IEType.GetType().InvokeMember("addressbar",System.Reflection.BindingFlags.SetProperty, null, IEType, new object[] { false};
   
        //IE窗体可见           
        IEType.GetType().InvokeMember("Visible",System.Reflection.BindingFlags.SetProperty, null, IEType, new object[] { true});
   
        //全屏显示          
        IEType.GetType().InvokeMember("FullScreen",System.Reflection.BindingFlags.SetProperty, null, IEType, new object[] { true});
     
        //导航到指定URL
        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; 代码如下:

     ///获取IE句柄
     [DllImport("USER32.DLL")]
     public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  
     ///将子窗体附加到父窗体上
     [DllImport("USER32.DLL")]
     public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
  
     //获取WPF窗体句柄,获取成功为非0值
     IntPtr Wpf_hwnd = ((HwndSource)PresentationSource.FromVisual(窗体实例)).Handle;
 
     //获取IE句柄,获取成功为非0值
     IntPtr IE_hwnd = FindWindow("ieframe", null)
 
     //将IE附加到WPF窗体上
     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();

转载于:https://my.oschina.net/Maculish/blog/536427

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值