检索Skype最近的聊天记录

时间:2015-01-14 18:16:40

标签: c++

我正在尝试提取最近的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;
}

0 个答案:

没有答案