从 Yahoo Messenger 检索对话






4.06/5 (13投票s)
2003年2月28日
2分钟阅读

137548

3660
描述了如何使用 MSHTML COM 接口从雅虎通(Yahoo Messenger)聊天窗口中检索文本。
引言
在本文中,我展示了如何从雅虎通(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 接口的指针。最后,为了在我们的应用程序中获取整个文本,我们获取IHTMLDocument2
的body
属性,它返回给我们一个指向IHTMLElement
接口的指针,并获取"c++">innerText
属性IHTMLElement
接口返回包含在会话文本中的整个文本。如果您想以原始 HTML 形式获取此文本,那么您可以调用IHTMLElement
的innerHTML
属性。
这应该从以下代码片段中看得很清楚
//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 );
}