65.9K
CodeProject 正在变化。 阅读更多。
Home

从 Yahoo Messenger 检索对话

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.06/5 (13投票s)

2003年2月28日

2分钟阅读

viewsIcon

137548

downloadIcon

3660

描述了如何使用 MSHTML COM 接口从雅虎通(Yahoo Messenger)聊天窗口中检索文本。

Sample Image - maximum width is 600 pixels

引言

在本文中,我展示了如何从雅虎通(Yahoo Messenger)中检索会话文本。第一篇文章讨论了如何从 MSN Messenger 中检索会话文本,可以在此处查看。在本文中,我们将讨论如何使用雅虎通(Yahoo Messenger)实现同样的功能。

正如第一篇文章中所述,为了从 Messenger 窗口中获取内容,我们所做的是我们遍历 Windows 操作系统中的所有顶级窗口,并检查它是否是我们想要的 Messenger 窗口,如果是,然后我们遍历它的子窗口以获取包含聊天文本的窗口的 HWND。一旦我们获得了窗口的句柄,我们就可以使用我们的代码来检索会话文本。除了从会话窗口句柄获取文本的最后一步之外,所有步骤对于 MSN 和雅虎通(Yahoo Messenger)都是相同的。在 MSN Messenger 中,我们使用 Windows 剪贴板从 MSN 窗口复制文本并将其粘贴到我们的应用程序中。这对于某些窗口有效,但并非所有窗口都支持它;雅虎通(Yahoo Messenger)会话窗口就是其中之一。

如果您打开 spy++ 并检查雅虎通(Yahoo Messenger)会话文本的窗口类,您会发现该窗口的窗口类是“Internet Explorer_Server”。此窗口由 Internet Explorer 安装,负责呈现和显示 HTML 页面。为了给开发人员提供灵活性,微软已经公开了允许我们从自己的进程中操作此窗口内容的机制。为了实现我们的目标,我们将使用指向包含会话窗口中显示的 HTML 文本的文档的指针。IHTMLDocument2接口表示会话窗口中包含的信息。MSDN 将IHTMLDocument2接口描述为此接口检索有关文档的信息,并检查和修改文档中的 HTML 元素和文本。。因此,为了获得指向IHTMLDocument2接口的指针,我们将向“Internet Explorer_Server”窗口发送WM_HTML_GETOBJECT窗口消息,并将结果传递给ObjectFromLresult()方法。对ObjectFromLresult()方法的成功调用会给我们一个指向 IHTMLDocument2 接口的指针。最后,为了在我们的应用程序中获取整个文本,我们获取IHTMLDocument2body属性,它返回给我们一个指向IHTMLElement接口的指针,并获取"c++">innerText属性IHTMLElement接口返回包含在会话文本中的整个文本。如果您想以原始 HTML 形式获取此文本,那么您可以调用IHTMLElementinnerHTML属性。

这应该从以下代码片段中看得很清楚

//Code snippet
char wndowclass[CLASS_SIZE];

if (GetClassName(hwnd,wndowclass,CLASS_SIZE)==0)
    return TRUE;

string strTemp(wndowclass);
if (strTemp==string("Internet Explorer_Server"))
{
    CoInitialize(NULL);
    HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
    string strTemp;
    CComPtr spDoc;
    LRESULT lRes;

    strTemp="";
    UINT nMsg = ::RegisterWindowMessage( 
                        _T("WM_HTML_GETOBJECT") );
    ::SendMessageTimeout( hwnd,
        nMsg,
        0L, 
        0L,
        SMTO_ABORTIFHUNG,
        1000,
        (DWORD*)&lRes );

    LPFNOBJECTFROMLRESULT pfObjectFromLresult =
        (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst,
        _T("ObjectFromLresult") );
    if ( pfObjectFromLresult != NULL )
    {
        HRESULT hr;
        hr = (*pfObjectFromLresult)( lRes,
            IID_IHTMLDocument2, 
            0, 
            (void**)&spDoc );
        if ( SUCCEEDED(hr) )
        {
            CComPtr pHTMLElement; 
            hr=spDoc->get_body(&pHTMLElement);
            BSTR bstrText;
            pHTMLElement->get_innerText(&bstrText);
            strTemp=(char *)_bstr_t(bstrText);

            pChatText->SetWindowText(strTemp.c_str());
        }
    }
    ::FreeLibrary( hInst );
}
© . All rights reserved.