2010-01-22 9 views
5

Quiero configurar una ventana determinada, desde una aplicación externa (por ejemplo, textedit), para ser la parte frontal.Configuración de la ventana más frontal utilizando la API de accesibilidad

Puedo obtener con éxito una referencia a la aplicación usando GetFrontProcess, y comprobar si es frontal. Si no es así, puedo usar setFrontProcess para enfocarlo.

Puedo usar la API de accesibilidad para examinar todas las ventanas de esa aplicación. Estoy comprobando que existe una cierta ventana, y si es así lo comparo contra la parte delantera mayoría de la ventana de la aplicación:

//get the front window of textEditApp and store it in 'currentFrontWindow' 
    AXUIElementCopyAttributeValue(textEditApp, kAXFocusedWindowAttribute, (CFTypeRef *)&currentFrontWindow); 

Si la ventana Me interesa no es más frontal, que necesito para configurarlo de modo. Pensé que podría usar AXUIElement Establecer AttributeValue para hacer esto, pero no estoy teniendo éxito. A continuación se muestra cómo he intentado hacerlo.

//set the front window of textEditApp to be desiredFrontWindow 
AXUIElementSetAttributeValue(textEditApp, kAXFocusedUIElementAttribute, desiredFrontWindow); 

He comprobado que la ventana existe, y la aplicación se 'cambió a' con éxito. ¿Pero por qué esta línea de código no lleva la ventana especificada al frente?

Gracias.

Respuesta

8

¿Pero por qué esta línea de código no lleva la ventana especificada al frente?

Porque intentó establecer un atributo de solo lectura.

Para hacer una ventana de frente, debe establecer la propiedad apropiada de la ventana. Lo mismo ocurre con una aplicación: para hacer que una aplicación se encuentre en primer plano, debe establecer la propiedad apropiada de la aplicación.

El nombre de Cocoa/Mac OS X para la ventana delantera es "la ventana principal". (Consulte, por ejemplo, NSApplication's y NSWindow's methods en relación con ese concepto.) La accesibilidad usa el mismo nombre, por lo que para hacer que una sola ventana se encuentre en primer plano, establezca el valor de kAXMainAttribute en kCFBooleanTrue.

La manera de hacer que la aplicación sea más avanzada es similar: establezca el valor de kAXFrontmostAttribute en kCFBooleanTrue. Tendrá que hacer ambas cosas para establecer la ventana delantera de la aplicación y activarla.

Por lo que puedo decir, no hay forma de acercar una sola ventana de una aplicación y darle un enfoque de sesión.

+0

Gracias (una vez más) Pedro - esto funciona a las mil maravillas. En cuanto a la aplicación, he estado usando setFrontProcess en lugar de kAXFrontMostAttribute: ¿es esta una mala idea? Después de haber navegado a través de la aplicación y la ventana, hay un cierto AXUIElementRef que estoy interesado en llevar al frente (es decir, darle el foco del teclado). Puedo enterrar las capas de elementos para obtener una referencia, pero ¿cómo lo configuro? ¿Hay un equivalente de kAXMainAttribute para los elementos? Tal vez debería publicar (aún) otra Q. –

1

Recientemente descubrí que, si no te importa un poco de carbono, puedes usar SetFrontProcessWithOptions para traer una ventana al frente y darle enfoque si pasas kSetFrontProcessFrontWindowOnly como el segundo argumento.

2

Pude lograr esto en una aplicación I worked on llevando la aplicación al frente y luego llevando una sola ventana al frente.

Primera llevar la aplicación a la parte delantera:

let currentPid = NSRunningApplication.currentApplication().processIdentifier 
if let pid = (the pid of the app in question) where pid != currentPid { 
    NSRunningApplication(processIdentifier: pid)?.activateWithOptions(.ActivateIgnoringOtherApps) 
} 

A continuación, el envío de la ventana en la parte delantera:

let window = (window AXUIElement) 
AXUIElementSetAttributeValue(window, NSAccessibilityMainAttribute, true) 
+1

Funciona para mí. Gracias. –

Cuestiones relacionadas