您的位置:首页 > 其它

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代码:

   //获取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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: