首页 文章

如何获取对其他应用程序中嵌入的Internet Explorer实例的COM引用

提问于
浏览
4

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

层次结构中的最后两个窗口(Shell DocObject View和Internet Explorer_Server)与正在运行的Internet Explorer实例中的嵌入式查看器完全相同 .

看起来必须有一些方法来获得这些嵌入式浏览器的COM引用 - 任何帮助或想法将不胜感激 .

2 回答

  • 3

    KB 249232 . 您可以使用辅助功能从 Internet Explorer_Server 窗口获取 IHTMLDocument2 指针 . 如果您运行的是与目标进程不同的完整性级别,那么它将起作用't pretty, and it won' .

    根据您正在做的事情,您可能会使目标应用程序不稳定,所以要小心 . 并注意编组 .

  • 0

    以下是使用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

相关问题