Я хочу использовать Доступность API для получения списка всех окон для данного (внешнего) приложения.
Цель состоит в том, чтобы проверить, открыто ли определенное окно. Сначала я проверяю, что приложение работает (использование [NSWorkspace runningApplications] и проверка каждого), и затем я хочу проверить текст строки заголовка каждого окна, которое открыто для того приложения.
PS
Таким образом, я могу создать элемент для приложения с помощью PID:
AXUIElementRef app = AXUIElementCreateApplication(pid);
но что я делаю с ним? Я даже иду в правильном направлении? Не может полагать, что настолько трудно найти примеры на этом.
Использование AxuilementCopyAttributevalues
Чтобы скопировать значение для kaxwindowsattribute
, который должен быть массивом объектов AxuElement, представляющих окна приложения.
Как вы можете догадаться от имени его функции, следует Правило копирования .
Вы можете использовать WindownumberswittionOptions: . Он перечисляет все окна от всех приложений по их номеру. Но я не могу найти, как получить Nswindow из окна ...
Я не знаю способ получить идентификатор окна и PID из API доступности.
Метод NSWindow Laurent упомянул только идентификаторы окна, но не PID окна, владеющего приложением.
Я бы использовал методы CGWindowlist, которые доступны с 10,5.
Чтобы получить список идентификаторов окон и PID владельца, вы можете попробовать следующее:
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
for (NSMutableDictionary* entry in (NSArray*)windowList)
{
NSString* ownerName = [entry objectForKey:(id)kCGWindowOwnerName];
NSInteger ownerPID = [[entry objectForKey:(id)kCGWindowOwnerPID] integerValue];
NSLog(@"%@:%d", ownerName, ownerPID);
}
CFRelease(windowList);
Вы можете управлять, если вы хотите, чтобы все окна (включая OffScreen, ...) с параметром опции.
Также объекты ввода содержат намного больше информации. Ссылка на документацию