Как получить URL активного окна с помощью API доступа Mac OS X - PullRequest
0 голосов
/ 09 ноября 2018

Мне было интересно, есть ли способ получить URL активного окна, если оно есть. Следующий код должен работать, но это не так, переменная title становится "", и я не получаю никакой новой информации.

Я уверен, что это потому, что я использую 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 голосов
/ 09 ноября 2018

Кажется, нет никакого общего способа сделать это. Например, Firefox не предоставляет ничего о своих окнах через API специальных возможностей.

С Safari мне удалось найти URL, но он был немного скрыт в иерархии элементов пользовательского интерфейса. Например, в синтаксисе спецификатора объекта 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 или разных конфигураций пользовательского интерфейса. (Например, в моем окне была открыта только одна вкладка.)

Возможно, вам придется написать код для перечисления всей иерархии элементов в поисках того, что вам нужно по роли.

Я не тестировал с Chrome. Однако я видел ссылку на «AXWebArea» в ее источниках, поэтому такая же стратегия может работать для него.

...