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