首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在FireFox中使用C++获取活动Tab URL

在FireFox中使用C++获取活动Tab URL
EN

Stack Overflow用户
提问于 2019-08-05 08:56:45
回答 1查看 1.9K关注 0票数 2

我正在尝试使用UI自动化从Firefox获得一个URL,但它一直失败。

在Chrome中效果很好。但它在Firefox中不起作用。我认为搜索或输入地址在Chrome中是相同的“地址和搜索栏”

代码语言:javascript
复制
#include <Windows.h>
#include <AtlBase.h>
#include <AtlCom.h>
#include <UIAutomation.h>
#include <stdlib.h>
#define UNICODE

int main()
{
    CoInitialize(NULL);
    HWND hwnd = NULL;
    while (true)
    {
        hwnd = FindWindowEx(0, hwnd, L"MozillaWindowClass", NULL);
        if (!hwnd)
            break;
        if (!IsWindowVisible(hwnd))
            continue;

        CComQIPtr<IUIAutomation> uia;
        if (FAILED(uia.CoCreateInstance(CLSID_CUIAutomation)) || !uia)
            break;

        CComPtr<IUIAutomationElement> root;
        if (FAILED(uia->ElementFromHandle(hwnd, &root)) || !root)
            break;

        CComPtr<IUIAutomationCondition> condition;


        uia->CreatePropertyCondition(UIA_ControlTypePropertyId,
            CComVariant(0xC354), &condition);


        CComPtr<IUIAutomationElement> edit;
        if (FAILED(root->FindFirst(TreeScope_Descendants, condition, &edit))
            || !edit)
            continue; //maybe we don't have the right tab, continue...

        CComVariant url;
        edit->GetCurrentPropertyValue(UIA_ValueValuePropertyId, &url);
        MessageBox(0, url.bstrVal, 0, 0);
        break;
    }
    CoUninitialize();
    return 0;
}

要获取活动选项卡URL的消息框中显示一个空白值

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-05 17:28:29

以上代码的主要部分被设计用于使用Chrome,而不是Firefox。

使用检查工具检查火狐中控件的排列。您将看到如下结构:

代码语言:javascript
复制
Firefox window
    -> "" toobar
    -> "" toobar
    -> "Navigation Toolbar" toobar
        -> "" combobox
            -> "Search with Google" edit //<- url editbox
        -> "Search" combobox //<- we don't want this

我们需要的控制标签“搜索与谷歌”。我们可以按名称查找元素,但这可能与语言有关,而且控件的顺序也可能不同,因为用户可以自定义浏览器并重新排列控件。

相反,我们可以查找AutomationId,在本例中,它在Firefox中是可用的(情况并不总是如此)

“导航”显示AutomationId = "nav-bar"属性,“编辑框”显示AutomationId = "urlbar-input"属性

我们可以使用UIA_AutomationIdPropertyId查找以下名称:

代码语言:javascript
复制
int main()
{
    if FAILED(CoInitialize(nullptr))
        return 0;
    struct coinit { ~coinit() { CoUninitialize(); } } cleanup;

    //find the first visible window in firefox
    HWND hwnd = NULL;
    while (true)
    {
        hwnd = FindWindowEx(0, hwnd, L"MozillaWindowClass", NULL);
        if (!hwnd)
            return 0;
        if (IsWindowVisible(hwnd))
            break;
    }

    //initialize UIAutomation
    CComPtr<IUIAutomation> uia;
    if FAILED(uia.CoCreateInstance(CLSID_CUIAutomation))
        return 0;

    CComPtr<IUIAutomationElement> root, navigation, editbox;
    CComPtr<IUIAutomationCondition> c1, c2;

    //find root from hwnd handle
    if FAILED(uia->ElementFromHandle(hwnd, &root))
        return 0;

    //find navigation bar as child of root
    uia->CreatePropertyCondition(UIA_AutomationIdPropertyId, 
        CComVariant(L"nav-bar"), &c1);
    if FAILED(root->FindFirst(TreeScope_Children, c1, &navigation))
        return 0;

    //find editbox under as descendant of navigation
    uia->CreatePropertyCondition(UIA_AutomationIdPropertyId, 
        CComVariant(L"urlbar-input"), &c2);
    if FAILED(navigation->FindFirst(TreeScope_Descendants, c2, &editbox))
        return 0;

    //get the string in editbox 
    CComVariant url;
    if FAILED(editbox->GetCurrentPropertyValue(UIA_ValueValuePropertyId, &url))
        return 0;
    if(url.bstrVal)
        wprintf(L"[%s]\n", url.bstrVal);

    return 0;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57355191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档