zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    spring MVC框架(入门篇)-1
    spring的三种注入方式
    mybitis实现增,删,改,查,模糊查询的两种方式:(2)
    [JavaEE] 20141228_Java类文章搜集
    [JavaEE] Apache Maven 入门篇(下)
    [JavaEE] Apache Maven 入门篇(上)
    [ASP.Net] MVC2,3,4,5的不同
    [JavaEE] Mybatis与Ibatis比较
    [ASP.Net] 转 > ASP.NET MVC 大牛之路
    [ASP.Net] 转 > ASP.NET MVC 小牛之路
  • 原文地址:https://www.cnblogs.com/Maculish/p/4980931.html
Copyright © 2011-2022 走看看