1

如果它是 C++ 中的 Web 浏览器,我需要获取活动 Windows 地址栏的内容。我已经想出了如何获取标题,并且可以获取记事本的内容,但是我卡在了浏览器上。

我的目标是让这项工作适用于 IE、Chrome 和 Firefox。如果这需要不同的方法,我会让程序尝试每一种方法,直到有一种方法返回数据。

这是我到目前为止所拥有的:

    HWND foreground = GetForegroundWindow();
    HWND hwndEdit = FindWindowEx(foreground, NULL, "EDIT", NULL);

    const int bufferSize = 5024;
    char textBuffer[bufferSize] = "";
    SendMessage(hwndEdit, WM_GETTEXT, (WPARAM)bufferSize, (LPARAM)textBuffer);

    cout << textBuffer;
4

3 回答 3

2

另一种适用于 IE 实例的工作方法:

#include <stdio.h>
#include <wchar.h>
#include <Windows.h>
#include <Exdisp.h>

//This imports the shell extionsions
//we disable warnings of multiple defines
#pragma warning(disable: 4192)
#pragma warning(disable: 4146)
#import <mshtml.tlb>
#import <shdocvw.dll>

void PrintBrowserInfo(IWebBrowser2 *pBrowser) {
    //These functions return Unicode strings.
    BSTR bstr;
    //Get the window title
    pBrowser->get_LocationName(&bstr);
    wprintf(L"Title: %s\n", bstr);
    SysFreeString(bstr);
    //Detect if this is Windows Explorer (My Computer) or Internet Explorer (the internet)
    IDispatchPtr spDisp;
    char *type = "Windows Explorer";
    if (pBrowser->get_Document(&spDisp) == S_OK && spDisp != NULL) {
        MSHTML::IHTMLDocument2Ptr spHtmlDocument(spDisp);
        if (spHtmlDocument != NULL) {
            MSHTML::IHTMLElementPtr spHtmlElement;
            spHtmlDocument->get_body(&spHtmlElement);
            if (spHtmlElement != NULL) {
                type = "Internet Explorer";
            }
        }
        spDisp.Release();
    }
    printf(" Type: %s\n", type);
    //Get the URL of the folder or web page
    pBrowser->get_LocationURL(&bstr);
    wprintf(L"  URL: %s\n\n", bstr);
    SysFreeString(bstr);
}

int main() {
    CoInitialize(NULL); //We need COM
    SHDocVw::IShellWindowsPtr spSHWinds;
    IDispatchPtr spDisp;
    //Find all explorer (Windows and Internet) and list them
    if (spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) == S_OK) {
        long nCount = spSHWinds->GetCount();
        for (long i = 0; i < nCount; i++) {
            _variant_t va(i, VT_I4);
            spDisp = spSHWinds->Item(va);
            SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
            if (spBrowser != NULL) {
                //spBrowser->AddRef();
                PrintBrowserInfo((IWebBrowser2 *)spBrowser.GetInterfacePtr());
                spBrowser.Release();
            }
        }
    } else {
        puts("Shell windows failed to initialise");
    }
    system("PAUSE");
    return 0;
}
于 2016-02-17T10:05:58.447 回答
1

所以看起来我已经为 IE 工作了,仍在 FireFox 和 Chrome 上工作。

这是IE的代码

    HWND foreground = GetForegroundWindow();
    HWND hwndEdit = FindWindowEx(foreground, NULL, "EDIT", NULL);

    HWND handle = FindWindowEx(foreground, NULL, "WorkerW", "Navigation Bar");
    if (NULL != handle)
    {
    handle = FindWindowEx(handle, NULL, "ReBarWindow32", NULL);
    if (NULL != handle)
    {
    handle = FindWindowEx(handle, NULL, "Address Band Root", NULL);
    }}
    HWND hwndEdit = FindWindowEx(handle, NULL, "Edit", NULL);

    const int bufferSize = 5024;
    Char textBuffer[bufferSize] = "";
    SendMessage(hwndEdit, WM_GETTEXT, (WPARAM)bufferSize, (LPARAM)textBuffer);

    string addressbartext = textBuffer;
    if(addressbartext == "AutoCompleteProxy")
    {addressbartext = "";}
    else
    {addressbartext = textBuffer;
    }

    cout << addressbartext;
于 2013-10-10T13:20:39.900 回答
0

请参阅:检查访问了哪个网站,但如果找到更好的解决方案,请告诉我,尤其是对于 Chrome。

于 2015-05-27T11:00:55.053 回答