我的需求,获取当前IE窗口的IHTMLDocument2对象来操作IE文档,如果是IE7,因为有多个Tab的情况,需要找到当前的IHTMLDocument2对象
问题:怎样找到当前IE窗口及当前的IHTMLDocument2对象呢?
已有代码提示:
SHDocVw.WebBrowser m_browser = null;
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindowsClass();
string filename;
foreach (SHDocVw.WebBrowser ie in shellWindows)
{
   filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();   if (filename.Equals("iexplore"))
   {
   m_browser = ie;
   break;
   }
}
mshtml.IHTMLDocument2 myDoc = (mshtml.IHTMLDocument2)m_browser.Document;
但这种方式获取到的IHTMLDocument2不一定是当前激活Tab的IE7的文档,
IntPtr hwnd = (IntPtr)m_browser.HWND;
hwnd = FindWindowEx(hwnd, IntPtr.Zero, "TabWindowClass", IntPtr.Zero);
IntPtr HchildWND = FindWindowEx(hwnd, (IntPtr)0, "Shell DocObject View", IntPtr.Zero);
if (HchildWND != (IntPtr)0)
{
    string c = "Internet Explorer_Server";
    HchildWND = FindWindowEx(HchildWND, (IntPtr)0, c, IntPtr.Zero);
}
到这一步可以访问到当前文档窗口的句柄,但是接下来该如何通过这个句柄获得IHTMLDocument2对象呢?请各位高手支招,给出有效代码或者参考的的给分,谢谢阿

解决方案 »

  1.   

    public static IHTMLDocument2 GetDomFromHwnd(IntPtr hwnd)
            {
                object obj1 = RuntimeHelpers.GetObjectValue(new object());
                Guid guid1 = new Guid("626FC520-A41E-11CF-A731-00A0C9082637");
                string text1 = "WM_Html_GETOBJECT";
                int num2 = RegisterWindowMessage(ref text1);
                if (num2 == 0)
                {
                    throw new Exception("Unable to register windows message in getDOMFromHwnd()");
                }
                IntPtr ptr1 = SendMessage(hwnd, num2, IntPtr.Zero, IntPtr.Zero);
                int num1 = ObjectFromLresult(ptr1, ref guid1, IntPtr.Zero, out obj1);
                if (num1 != 0)
                {
                    throw new Exception("Unable to get IE DOM from window message result in getDOMFromHwnd()");
                }
                return (IHTMLDocument2)obj1;        }