用Spy++查一下IE的窗口类,然后自己编写一个监控程序,用FindWindow得到窗口的Handle,再用GetWindowText之类的函数得到。我没试过,从原理上讲应该能够实现。

解决方案 »

  1.   

    下面这个贴子讨论的是如何得到IE当前显示的HTML文件,你看看有没有用?主  题:IE编程:如何得到IE当前显示的HTML文件?
    作  者:limz
    所属论坛:Visual C++
    问题点数:50
    回复次数:3
    发表时间:2000-11-11 15:00:00
     
    如何得到IE当前显示的HTML文件?
    我在微软站点上看到,要写一个com程序,须实现IObjectWithSite。
    原文:
    (If your COM object needs to access the DHTML Object Model of the page that Internet Explorer is currently displaying, you must implement IObjectWithSite.
    ...
    When IObjectWithSite is implemented, Internet Explorer will call IObjectWithSite::SetSite and pass it a pointer to IShellBrowser.

    但是从IShellBrowser又该怎样写才能得到当前显示的HTML文件?
    IObjectWithSite::SetSite(IUnknown *pUnkSite)
    {}
    先谢谢各位!(也请edyang兄再来看看这个问题!多谢!)
     
    回复贴子: 
    回复人:edyang(2000-11-11 16:01:00)  得30分 
    (edyang 的脸先是红了一下,但很快就恢复了正常,一本正经的说)
    嘿嘿,看来老兄世行内高手,献丑献丑。我想你能不能从 pUnkSite 的到 IHTMLDocument 的接口呢?如果能得到的话,一切问题就解决。由于本人时间有限,没有做实验:HRESULT      hr;
    IHTMLDocument *pIHTMLDoc;hr = pUnkSite->QueryInterface(IID_IHTMLDocument, (void **)&pIHTMLDoc);
    if(SUCCEEDED(hr))
    {
    _com_ptr_t(pIHTMLDoc) ptrDoc;hr = ptrDoc.QueryInterface(IID_IPersistStreamInit, &pPersistStream);
    if(pPersistStream == NULL)
    return;
    if(FAILED(pPersistStream->GetSizeMax(&uli)))
    {
    pPersistStream->Release();
    return;
    }
    //if(uli.LowPart == 0)
    //{
    //pPersistStream->Release();
    //return;
    //}uli.LowPart = 65536;
    hMem = ::GlobalAlloc(GPTR, uli.LowPart);
    if(hMem == NULL)
    {
    pPersistStream->Release();
    return;
    }hr = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream);
    if(FAILED(hr))
    {
    pPersistStream->Release();
    ::GlobalFree(hMem);
    return;
    }
    hr = pPersistStream->Save(pStream, TRUE);AfxMessageBox((LPCTSTR)hMem);hr = pPersistStream->Release();
    pStream->Release(); 

     
    回复人:limz(2000-11-11 16:52:00)  得0分 
    to edyang兄:
    我试过了不能从 pUnkSite 的到 IHTMLDocument 的接口。还有没有其他的接口? 
     
    回复人:edyang(2000-11-11 17:12:00)  得20分 
    哦,试一试 IHTMLDocument2 怎样?MSDN 对 IShellBrowser 的解释是:
    The IShellBrowser interface is exposed by Windows Explorer and the Open File common dialog box to provide services for namespace extensions. 我想你可能在做一个对 Windows Explorer 的扩展?或者是镶嵌在 IE 里面的 COM(ActiveX)控件? 
      

  2.   

    请你好好去看一下IWebBrowser2接口,这东西还是有一点点复杂的,先获取当前htm的文档指针,然后把它映射到一个IHTMLDocument2接口指针,开始调用任何IHTMLDocument2方法开始访问其他HTML对象!或者看看:CHtmlView::GetLocationURL()
      

  3.   

    用FindWindow找到IE窗口后,再用FindWindowEx找类为Edit的子窗口,得到的就是那个地址栏的句柄,然后再用GetWindowText即可得到其中的内容。
      

  4.   

    //以前我用c++builder写的,不用怎么改就能用的。
    HWND handle=0; 
    //通过一系列的FindWindowEx找到地址栏的编辑框句柄,窗口的类名可通过WINSIGHT32找到 
    handle=FindWindowEx(handle,0,"IEFrame",NULL); 
    handle=FindWindowEx(handle,0,"WorkerA",NULL); 
    handle=FindWindowEx(handle,0,"ReBarWindow32",NULL); 
    handle=FindWindowEx(handle,0,"ComboBoxEx32",NULL); 
    handle=FindWindowEx(handle,0,"ComboBox",NULL); 
    handle=FindWindowEx(handle,0,"Edit",NULL); 
    //取得URL的长度 
    int i=SendMessage(handle,WM_GETTEXTLENGTH,0,0); 
    char *tem=new char[i]; 
    //取回URL并显示 
    SendMessage(handle,WM_GETTEXT,i+1,long(tem)); 
    ShowMessage("The current URL is "+AnsiString(tem)); 
    delete tem; 
    //设置URL并模拟回车 
    AnsiString myurl="nethome.yesky.com"; 
    SendMessage(handle,WM_SETTEXT,0,long(myurl.c_str())); 
    SendMessage(handle,WM_KEYDOWN,VK_RETURN,0); 
    //该示例只对最近打开或激活的IE窗口有效,若要对全部IE窗口操作,可配合EnumWindows使用 
      

  5.   

    to kingofwang:
    我运行过你的程序,不行哦!跟踪了一下,发现handle老是0。我是在VC++6.0下的。