Outlook的Dynamics插件通过Internet Explorer嵌入式窗口显示内容。我正在尝试找到一种方法来获取该嵌入式窗口的SHDocVw.InternetExplorer COM对象。我们的应用程序独立运行(它不是Outlook或IE插件),我们根本无法控制嵌入式IE窗口的创建。
当我使用:
Dim SWs As SHDocVw.ShellWindows
Set SWs = New SHDocVw.ShellWindows
SWs集合不包含对Outlook中嵌入式浏览器的引用(尽管我确实获得了对常规浏览器窗口的引用)。
使用Spy++,我看到了嵌入式Outlook窗口的以下窗口层次结构:
Window "xxxxxx" WindowsForms10.Window.8.app.0.5c39d4_r64_ad2
- "" Shell Embedding
- "" Shell DocObject View
- "" Internet Explorer_Server
层次结构中的最后两个窗口(外壳DocObject视图和Internet Explorer_Server)与正在运行的Internet Explorer实例中的嵌入式查看器完全相同。
似乎必须有一些方法来获得对这些嵌入式浏览器的COM引用-任何帮助或想法都将非常感谢。
发布于 2018-07-15 01:52:54
下面是使用Hwnd获取HTMLDocument的方法:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using mshtml;
namespace HookBrowser
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
#region API CALLS
[DllImport("user32.dll", EntryPoint = "GetClassNameA")]
public static extern int GetClassName(IntPtr hwnd, StringBuilder lpClassName, int nMaxCount);
/*delegate to handle EnumChildWindows*/
public delegate int EnumProc(IntPtr hWnd, ref IntPtr lParam);
[DllImport("user32.dll")]
public static extern int EnumChildWindows(IntPtr hWndParent, EnumProc lpEnumFunc, ref IntPtr lParam);
[DllImport("user32.dll", EntryPoint = "RegisterWindowMessageA")]
public static extern int RegisterWindowMessage(string lpString);
[DllImport("user32.dll", EntryPoint = "SendMessageTimeoutA")]
public static extern int SendMessageTimeout(IntPtr hwnd, int msg, int wParam, int lParam, int fuFlags, int uTimeout, out int lpdwResult);
[DllImport("OLEACC.dll")]
public static extern int ObjectFromLresult(int lResult, ref Guid riid, int wParam, ref IHTMLDocument2 ppvObject);
public const int SMTO_ABORTIFHUNG = 0x2;
public Guid IID_IHTMLDocument = new Guid("626FC520-A41E-11CF-A731-00A0C9082637");
#endregion
public IHTMLDocument2 document;
private void button1_Click(object sender, EventArgs e)
{
document = documentFromDOM();
/// check that we have hold of the IHTMLDocument2...
if (!(bool)(document == null))
{
this.Text = document.url;
}
}
private IHTMLDocument2 documentFromDOM()
{
Process[] processes = Process.GetProcessesByName("iexplore");
if (processes.Length > 0)
{
IntPtr hWnd = processes[0].MainWindowHandle;
int lngMsg = 0;
int lRes;
EnumProc proc = new EnumProc(EnumWindows);
EnumChildWindows(hWnd, proc, ref hWnd);
if (!hWnd.Equals(IntPtr.Zero))
{
lngMsg = RegisterWindowMessage("WM_HTML_GETOBJECT");
if (lngMsg != 0)
{
SendMessageTimeout(hWnd, lngMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, out lRes);
if (!(bool)(lRes == 0))
{
int hr = ObjectFromLresult(lRes, ref IID_IHTMLDocument, 0, ref document);
if ((bool)(document == null))
{
MessageBox.Show("NoLDocument Found!", "Warning");
}
}
}
}
}
return document;
}
private int EnumWindows(IntPtr hWnd, ref IntPtr lParam)
{
int retVal = 1;
StringBuilder classname = new StringBuilder(128);
GetClassName(hWnd, classname, classname.Capacity);
/// check if the instance we have found is Internet Explorer_Server
if ((bool)(string.Compare(classname.ToString(), "Internet Explorer_Server") == 0))
{
lParam = hWnd;
retVal = 0;
}
return retVal;
}
}
}
有关更多信息,请参阅此链接:
http://www.xtremevbtalk.com/code-library/295336-internet-explorer-dom-using-objectfromlresult.html
https://stackoverflow.com/questions/11146948
复制相似问题