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();
  • 相关阅读:
    tile38 复制配置
    The Guardian’s Migration from MongoDB to PostgreSQL on Amazon RDS
    tile38 一款开源的geo 数据库
    sqler sql 转rest api 的docker 镜像构建(续)使用源码编译
    sqler sql 转rest api javascript 试用
    sqler sql 转rest api redis 接口使用
    sqler sql 转rest api 的docker image
    sqler sql 转rest api 的工具试用
    apache geode 试用
    benthos v1 的一些新功能
  • 原文地址:https://www.cnblogs.com/Maculish/p/4980931.html
Copyright © 2011-2022 走看看