Я пытаюсь установить приложение , которое изменяет размеры окон с помощью 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 не достаточно, так как процесс может иметь несколько окон.
Как я могу получить некоторый уникальный идентификатор активного окна в Какао?
(Кстати, реальный код проверяет коды возврата в вышеуказанных вызовах; ошибки нет, вызовы успешны.)