IE浏览器合并到WPF窗体中
2015-11-20 15:32
183 查看
借助win32 API将K模式的IE合并到WPF窗体中。
使用反射设置IE以K模式展示;使用反射的前提是了解IE对外暴露的接口,参考 https://msdn.microsoft.com/en-us/library/aa752084(v=vs.85).aspx
创建K模式IE代码:
View Code
通过Win32API获取IE句柄,然后调用API将子窗体附件到父窗体
在WPF中获取窗体句柄的方式为:IntPtr hwnd = ((HwndSource)PresentationSource.FromVisual(你要获取的窗体的对象)).Handle;
代码如下:
用反射创建的IE,在关闭WPF窗体的时候,并不会被关闭,即使是使用Process.kill()杀进程的方法,也无法关闭IE界面,无法终止进程。
照成这个现象的原因是因为使用了非托管的com对象(就是IE),所以在关闭的时候要先调用System.Runtime.InteropServices.Marshal.ReleaseComObject()来释放该IE对象(原因请参考CLR调用非托管对象),然后调用Kill方法杀死IE进程。
使用反射设置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" });
View Code
通过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();
相关文章推荐
- Oracle中生成随机数的函数
- 【03】WAMPServer集成环境下载和安装
- 关于c中的inline
- iOS 时间格式转化合集
- 详释(常见UITextView 输入之字数限制)之一---固定长度
- 解决Jsp报错:Multiple annotations found at this line
- AlertDialog笔记
- android 画图之setXfermode 处理两图相交叉的情况
- 【转】JMeter Tutorial的安装和具体操作
- POJ1018
- MySQL学习笔记(一)
- PASSION之Linux命令集
- 批量scp脚本——从多台机器拷贝相同文件
- Java正则表达式
- 我的电脑界面增加程序快捷方式
- 关于zTree树形插件搜索框。
- poj3349(hash table)
- 代码阅读方法与实践(二)
- ActionContext
- 【转】JMeter代理录制脚本