CGWindowID от AXUIElement

Я пытаюсь автоматизировать стороннее приложение OSX, используя API специальных возможностей. Некоторое состояние приложения недоступно через API, поэтому я получаю его с помощью скриншота экрана. Для этого мне нужно получить CGWindowID для объекта доступности с "оконной ролью".

Есть ли прямой способ получить CGWindowID объекта доступности Window Role? Я могу получить это эвристически, сопоставляя различные атрибуты окна, такие как размер, заголовок и местоположение, но это действительно смешно, и я чувствую себя лучше, если мое приложение будет также поддерживать угловые случаи, даже если они маловероятны,

3 ответа

Решение

Там нет никакого способа сделать это; иерархия доступности полностью отделена от фактической иерархии окон / представлений. Я думаю, что ваше соответствие будет работать лучше всего.

Существует функция, по крайней мере, от Leopard и выше (по состоянию на 10.7.3):

extern "C" AXError _AXUIElementGetWindow(AXUIElementRef, CGWindowID* out);

Обычные предостережения об использовании чего-то подобного применимы, хотя. Это может измениться, как только следующее обновление ОС!

Правильное текущее объявление в заголовке Swift Bridging:

      #import <AppKit/AppKit.h>

AXError _AXUIElementGetWindow(AXUIElementRef element, uint32_t *identifier);

Как используется здесь: https://github.com/rxhanson/Rectangle/blob/master/Rectangle/Rectangle-Bridging-Header.h

Другие вопросы по тегам