Estoy intentando parchar an application que redimensiona las ventanas usando la API de accesibilidad.Identificar de forma exclusiva la ventana activa en OS X
Necesito mantener un diccionario con los tamaños anteriores de windows. La clave necesita identificar la ventana actualmente activa. Por el momento, esta ventana activa se recupera a través del NSAccessibilityFocusedWindowAttribute
al presionar una tecla de acceso directo.
Sin embargo, cada vez que se llama a este método, el AXUIElementRef
devuelto que identifica la ventana es diferente! Esto, por supuesto, significa que no puedo usarlo como una clave de diccionario; el diccionario no encontrará la entrada correspondiente.
El código siguiente reproduce el problema:
-(IBAction)testWindowIdentification:(id)sender{
AXUIElementRef focusedApp;
AXUIElementRef focusedWindow;
AXUIElementCopyAttributeValue(_systemWideElement,
(CFStringRef) kAXFocusedApplicationAttribute,
(CFTypeRef*) &focusedApp);
AXUIElementCopyAttributeValue((AXUIElementRef) focusedApp,
(CFStringRef) NSAccessibilityFocusedWindowAttribute,
(CFTypeRef*) &focusedWindow);
CFShow(focusedWindow);
}
_systemWideElement
se ha inicializado en el método init
mediante una llamada a AXUIElementCreateSystemWide()
.
La declaración CFShow
muestra claramente diferentes ID cada vez que se llama al método (a pesar de que la misma ventana está activa), que es inútil para mí:
<AXUIElement 0x47e850> {pid=42463}
<AXUIElement 0x47e890> {pid=42463}
<AXUIElement 0x47e2c0> {pid=42463}
…
El documentation on AXUIElement
muestra ningún método que recupera un atributo único para el elemento UI, y tampoco lo hace that of the NSAccessibility
protocol. El PID único es no suficiente para mí, ya que un proceso puede tener varias ventanas.
¿Cómo puedo recuperar algún identificador único de la ventana activa en Cocoa?
(Por cierto, el código real es el control de los códigos de retorno en las llamadas anteriores; no hay ningún error, las llamadas a tener éxito.)
@JeremyBanks El que responde originalmente tiene la idea correcta aquí. De hecho, puede usar Quartz para obtener un 'CGWindowID' una vez que haya determinado la ventana enfocada, si [esta respuesta] (http://stackoverflow.com/a/312099/517815) es de creer. Este _debería darle el identificador de ventana único que está esperando, que puede pasar impunemente en el contexto de su aplicación actual. Avíseme si desea una versión más coherente y completa de esto como una respuesta real. – MrGomez
@MrGomez Seguro, una respuesta como esa sería genial. :) –
@JeremyBanks Will do. Estoy un poco sobrecargado hoy, pero trataré de obtener una respuesta a esto en algún momento más tarde esta noche (PST). :) – MrGomez