Я пытаюсь установить приложение, которое изменяет размеры окон с помощью API доступности.
Мне нужно поддерживать словарь с предыдущими размерами окон. Ключ должен идентифицировать текущее активное окно. На данный момент это активное окно извлекается через NSAccessibilityFocusedWindowAttribute
после нажатия горячей клавиши.
Однако, каждый раз, когда вызывается этот метод, возвращаемый AXUIElementRef
, который идентифицирует окно, отличается! Это, конечно, означает, что я не могу использовать его в качестве словарного ключа - словарь не найдет соответствующую запись.
Следующий код воспроизводит проблему:
-(IBAction)testWindowIdentification:(id)sender{
AXUIElementRef focusedApp;
AXUIElementRef focusedWindow;
AXUIElementCopyAttributeValue(_systemWideElement,
(CFStringRef) kAXFocusedApplicationAttribute,
(CFTypeRef*) &focusedApp);
AXUIElementCopyAttributeValue((AXUIElementRef) focusedApp,
(CFStringRef) NSAccessibilityFocusedWindowAttribute,
(CFTypeRef*) &focusedWindow);
CFShow(focusedWindow);
}
_systemWideElement
был инициализирован в методе init
, используя вызов AXUIElementCreateSystemWide()
.
Оператор CFShow
четко показывает разные идентификаторы при каждом вызове метода (даже при том, что одно и то же окно активно), что бесполезно для меня:
<AXUIElement 0x47e850> {pid=42463}
<AXUIElement 0x47e890> {pid=42463}
<AXUIElement 0x47e2c0> {pid=42463}
…
Документация на AXUIElement
не отображает метод, который извлекает уникальный атрибут для элемента пользовательского интерфейса, а также протокола NSAccessibility
.
Единственного PID для меня недостаточно, так как процесс может иметь несколько окон.
Как получить уникальный идентификатор активного окна в Cocoa?
(Кстати, реальный код проверяет коды возврата в вышеуказанных вызовах, нет ошибки, вызовы преуспевают).