2012-10-02 27 views
23

Cuando se ejecuta Mission Control, impide que las aplicaciones reciban eventos de teclado y mouse. También deja correr la última aplicación pensando que todavía tiene foco. Esto es un problema para mí porque no recibo eventos KeyUp o mouseUp si comienzo Mission Control con un botón del mouse o una tecla presionada y mi aplicación se comportará como si el botón o la tecla del mouse se mantuviera presionada.OSX: ¿Cómo detectar si se está ejecutando Mission Control?

Me gustaría una forma de leer los eventos del teclado y el mouse incluso cuando el Control de Misión está activo, o una forma de detectar que el Control de Misión está activo. Idealmente, me gustaría poder hacer esto último ya que efectivamente no puedo usar mi aplicación cuando se ejecuta Mission Control.

he intentado un par de cosas sin suerte:

  1. Uso addGlobalMonitorForEventsMatchingMask registrar un monitor global para eventos de teclado y de ratón. Esto captura los eventos del mouse (pero no los eventos del teclado, aunque el documentation dice que los eventos KeyDown deben enviarse al monitor global) cuando cambio a otra aplicación, pero el control de la misión no parece permitir que los eventos se propaguen a los monitores globales.
  2. Verificar [[NSRunningApplication currentApplication] {isActive, ownsMenuBar}]. Aparentemente, mi aplicación está activa aunque no esté recibiendo eventos.
  3. Verificar [NSApp keyWindow] != nil. Aparentemente, una de mis ventanas debería recibir eventos clave. Ninguno de ellos lo son.
  4. Compruebe si Mission Control es una de las aplicaciones en ejecución devuelto por [NSWorkspace runningApplications]. Mission Control no aparece en esta lista cuando se está ejecutando.

¡Gracias de antemano!

Editar:

fin he trabajado alrededor de este problema (aunque no de una manera muy satisfactoria). Para el mouse, resulta que puede consultar el estado de los botones presionados con [NSEvent pressedMouseButtons]. Simplemente hago un seguimiento de lo que creo que debería ser el estado del mouse de los eventos NSLeftMouseDown y NSLeftouseUp y lo comparo con [NSEvent pressedMouseButtons] de vez en cuando para asegurarme de que sean consistentes. Si no lo son, entonces sé que algo ha secuestrado mi evento NSLeftouseUp y actuar en consecuencia.

Para el teclado, no pude encontrar una manera de consultar el estado del teclado, por lo que no pude hacer una solución similar. Terminé desactivando la conmutación de aplicaciones usando presentation options cuando se presionan las teclas.

+2

De los documentos: "Los eventos relacionados con las claves solo se pueden supervisar si la accesibilidad está habilitada o si su aplicación es de confianza para el acceso de accesibilidad (consulte AXIsProcessTrusted)." - Esta es probablemente la razón por la que no está obteniendo eventos clave. Habilite "acceso para dispositivos de asistencia" en las preferencias de accesibilidad del sistema y vea si eso cambia algo. – omz

+0

Tiene razón, habilitar la accesibilidad sí me da eventos clave globales, pero no cuando el Control de la misión está activo. –

+0

Recomiendo que presente un informe de error: developer.apple.com/bugreporter -Además, es mejor permitir que los seguidores ideen soluciones que pedir algo específico. Dicho esto, el informe de error solo debe identificar el problema de forma clara y concisa. – Bobjt

Respuesta

0

Puede ser que me esté perdiendo algo, pero ¿ha tratado de usar los grifos de eventos en lugar de la supervisión global?

1

¿Has probado el nivel bash con NSTask? Algo como ps -faxU <username> debería enumerar todos los procesos en ejecución y luego podría analizar el resultado, o bien podría usar ps -faxU <username> | grep -i "mission control" (En la parte superior de mi cabeza no estoy seguro de cómo se puede llamar al proceso, pero algo así como "control de misión" parece legítimo) . No es la solución más elegante, pero si nada funciona, puede valer la pena.

+0

Lo intenté en la terminal. Desafortunadamente, Mission Control existe por muy poco tiempo porque todo lo que hace es enviar un mensaje mach al proceso de Dock (ver [link] (http://macosxsecrects.blogspot.com/2012/06/notification-center-notification-system) .html)), por lo que nunca lo vería activo en la lista de procesos en ejecución. Escuchar las notificaciones de NSWorkspace que indican cuándo aparecen las aplicaciones tampoco mostró rastro de Mission Control. Las otras opciones en [esta página] (http://developer.apple.com/library/mac/#technotes/tn2050/_index.html) no eran viables para mí por otros motivos. –

0

Parece que DTrace tiene alguna posibilidad de ver que se active el Control de Misión.Intente ejecutar:

sudo fs_usage -filesys | grep Misión

desde la línea de comandos y luego ejecuta la aplicación Mission Control desde la carpeta/Aplicación.

Debería ver muchos resultados relacionados con el inicio del Control de Misión. Desafortunadamente, esta misma salida no apareció al usar el atajo de teclado o deslizar. Por supuesto, usar DTrace en el código de producción no es algo que realmente recomiende.

2

Al menos en OS X 10.10, se puede utilizar este código para comprobar si el control de la misión está activo o no:

func missionControlIsActive() -> Bool 
{ 
    var result: Bool = false 
    let windowInfosRef = CGWindowListCopyWindowInfo(CGWindowListOption(kCGWindowListOptionOnScreenOnly), CGWindowID(0)) // CGWindowID(0) is equal to kCGNullWindowID 
    let windowList: NSArray = windowInfosRef.takeRetainedValue() // We own the returned CFArrayRef 
    for entry in windowList 
    { 
     if (entry.objectForKey("kCGWindowOwnerName") as! String) == "Dock" 
     { 
      var bounds: NSDictionary = entry.objectForKey("kCGWindowBounds") as! NSDictionary 
      if (bounds.objectForKey("Y") as! NSNumber) == -1 
      { 
       result = true 
      } 
     } 
    } 
    return result 
} 

En pocas palabras, el código comprueba si aparece una ventana específica de propiedad del OS X Dock proceso es visible en la pantalla y si está en una posición específica. Si se cumplen ambas condiciones, el Control de Misión estará activo en este momento. El código funcionará en una aplicación de espacio aislado y no se requieren privilegios para los dispositivos de asistencia.

+0

FWIW, esto no funciona para mí exactamente en 10.11 (suponiendo que traduje correctamente de Swift a Obj-C). Sin embargo, invocar el Control de Misión conduce a entradas adicionales con "Dock" como el nombre del propietario, por lo que podría haber otra forma de analizarlas para averiguar si MC es definitivamente lo que está causando eso. Tengo que dejar el problema por ahora, pero lo actualizaré si lo resuelvo ... – Matt

Cuestiones relacionadas