我正在尝试提取最近的Skype消息窗口的内容,该窗口包含在TChatContentControl窗口类(TConversationForm的子节点,该节点又是tSkMainForm的子节点)中。我使用C ++。
我试图使用WM_GETTEXT SendMessage方法但没有成功。 我进一步尝试使用AccessibleObjectFromEvent方法,检索IAccessible接口的值/名称但没有成功。
我进一步期望Skype将这些数据存储为html并使用WM_HTML_GETOBJECT消息来解释IHTMLElement结构(与Yahoo Messenger完美配合),但仍然没有成功。
之前有过更多经验的人知道Skype如何存储这些数据以及它的出路是什么?
非常感谢您的支持。
为了让这个线程恢复活力,让我与大家分享一段简化的代码 雅虎将使用Skype实现我的目标:
#include <Windows.h>
#include <Oleacc.h>
#include <atlbase.h>
#include <mshtml.h>
#pragma comment (lib, "Oleacc.lib")
void CALLBACK WinEventProc(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
char className[50];
GetClassName(hwnd, className, 50);
if (strcmp(className, "CTabbedIMHost") == 0)
{
HWND wndbase = FindWindowEx(hwnd, 0, "CConvWndBase", NULL);
HWND container = FindWindowEx(wndbase, 0, "YHTMLContainer", NULL);
HWND exp = FindWindowEx(container, 0, "Internet Explorer_Server", NULL);
if (NULL != exp)
{
CComPtr<IHTMLDocument2> ieDoc;
LRESULT lRes;
UINT uMsg = RegisterWindowMessage(_T("WM_HTML_GETOBJECT"));
SendMessageTimeout(exp, uMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes);
HRESULT hRes = ObjectFromLresult(lRes, IID_IHTMLDocument2, 0, (void**)&ieDoc);
if (SUCCEEDED(hRes))
{
CComPtr<IHTMLElement> pHTMLElement;
hRes = ieDoc->get_body(&pHTMLElement);
BSTR bstrBodyText;
pHTMLElement->get_innerText(&bstrBodyText);
// MessageBoxW(NULL, bstrBodyText, L"Yahoo Messenger", MB_OK | MB_ICONASTERISK);
}
}
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdParam, int iCmdShow)
{
MSG msg;
CoInitializeEx(NULL, COINIT_MULTITHREADED);
HWINEVENTHOOK LHook = SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_VALUECHANGE, 0, WinEventProc, 0, 0, WINEVENT_SKIPOWNPROCESS);
while (GetMessage(&msg, NULL, 0, 0) != 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWinEvent(LHook);
CoUninitialize();
return 0;
}