如何使用Mac OS X可访问性API检索活动窗口URL

时间:2018-11-09 16:43:41

标签: macos accessibility objective-c++

我想知道是否有一种方法可以检索活动窗口的URL(如果有的话)。以下代码应该可以工作,但是不能,标题变量变为"",并且我没有得到任何新信息。

我很肯定那是因为我使用的是错误对象的kAXURLAttributes,但是我不知道应该从哪个对象复制它……Apple的文档很少有解释。

AXUIElementRef appElem = AXUIElementCreateApplication(pid), window = nullptr;
        CFStringRef title = nullptr;
        if (!appElem) { return; }
        if (AXUIElementCopyAttributeValue (appElem, kAXFocusedWindowAttribute,
                                           reinterpret_cast<CFTypeRef*>(&window)) != kAXErrorSuccess && appElem)
            CFRelease(appElem);
        if(AXUIElementCopyAttributeValue (window, kAXTitleAttribute,
                                          reinterpret_cast<CFTypeRef*>(&title))!=kAXErrorSuccess && window)
            CFRelease(window);
        focusedAppTitle = QString::fromCFString(title);
            if(AXUIElementCopyAttributeValue (window, kAXURLAttribute,
                                              reinterpret_cast<CFTypeRef*>(&title))!=kAXErrorSuccess)
            CFRelease(window);
        }

1 个答案:

答案 0 :(得分:1)

似乎没有任何一般的方法可以做到这一点。例如,Firefox不会通过Accessibility API公开其窗口的任何内容。

使用Safari,我可以找到该URL,但是它有点埋在UI元素层次结构中。例如,在AppleScript对象说明符语法中,对象为:

UI element 2 of group 2 of toolbar 1 of window 1 of ¬
    application process "Safari" of application "System Events"

该元素的角色是“ AXSafariAddressAndSearchField”,其值是URL。如果用户正在编辑该字段的内容,则其值可能会显示编辑内容,而不是实际显示内容的URL。我不知道。

还有:

UI element 1 of scroll area 1 of group 1 of group 1 of ¬
    tab group 1 of splitter group 1 of window 1 of ¬
    application process "Safari" of application "System Events"

该元素的角色为“ AXWebArea”。它具有“ AXURL”(kAXURLAttribute)属性,其值是页面的URL。

对于其他版本的Safari或不同的UI配置,这些可访问性路径可能有所不同。 (例如,我的窗口仅打开了一个标签。)

您可能必须编写代码来枚举整个元素层次结构,以按角色查找所需的元素。

我尚未使用Chrome进行测试。我确实在其来源中看到了对“ AXWebArea”的引用,因此相同的策略可能适用于它。