Quando il controllo missione viene eseguito, impedisce alle applicazioni di ricevere eventi da tastiera e mouse. Lascia anche l'ultima applicazione in esecuzione pensando che sia ancora focalizzata. Questo è un problema per me perché non ricevo gli eventi keyUp o mouseUp se avvio Mission Control con un pulsante del mouse o un tasto premuto e la mia applicazione si comporterà come se si tenesse premuto quel pulsante o tasto del mouse.OSX: come rilevare se il controllo missione è in esecuzione?
Vorrei un modo per leggere gli eventi sia della tastiera sia del mouse anche quando il controllo missione è attivo o un modo per rilevare che il controllo missione è attivo. Idealmente, mi piacerebbe essere in grado di fare quest'ultimo perché non posso usare la mia applicazione quando Mission Control è in esecuzione.
Ho provato un paio di cose senza fortuna:
- Usa addGlobalMonitorForEventsMatchingMask registrare un monitor globale per gli eventi di tastiera e mouse. Cattura gli eventi del mouse (ma non gli eventi della tastiera, anche se lo documentation dice che gli eventi keyDown devono essere inviati al monitor globale) quando passo a un'altra applicazione, ma il controllo missione non sembra consentire la propagazione degli eventi ai monitor globali.
- Controllare
[[NSRunningApplication currentApplication] {isActive, ownsMenuBar}]
. Apparentemente, la mia applicazione è attiva anche se non riceve eventi! - Controllare
[NSApp keyWindow] != nil
. Apparentemente, una delle mie finestre dovrebbe ricevere eventi chiave. Nessuno di loro lo sono. - Verificare se Mission Control è una delle applicazioni in esecuzione restituite da
[NSWorkspace runningApplications]
. Mission Control non compare in questo elenco quando è in esecuzione.
Grazie in anticipo!
Edit:
ho finalmente lavorato intorno a questo problema (anche se non in modo molto soddisfacente). Per il mouse, risulta che è possibile interrogare lo stato dei pulsanti premuti con [NSEvent pressedMouseButtons]
. Semplicemente tengo traccia di quello che penso debba essere lo stato del mouse dagli eventi NSLeftMouseDown e NSLeftouseUp e lo confrontiamo allo [NSEvent pressedMouseButtons]
ogni tanto per assicurarci che siano coerenti. Se non lo sono, so che qualcosa ha dirottato il mio evento NSLeftouseUp e agire di conseguenza.
Per la tastiera, non sono riuscito a trovare un modo per interrogare lo stato della tastiera, quindi non è stato possibile eseguire una soluzione simile. Ho finito per disabilitare la commutazione delle applicazioni usando presentation options quando i tasti sono premuti.
Dalla documentazione: "Gli eventi relativi alle chiavi possono essere monitorati solo se l'accessibilità è abilitata o se l'applicazione è attendibile per l'accesso all'accessibilità (vedere AXIsProcessTrusted)." - Questo è probabilmente il motivo per cui non ricevi eventi chiave. Abilitare "accesso per dispositivi assistivi" nelle preferenze di accessibilità del sistema e vedere se questo cambia qualcosa. – omz
Hai ragione, abilitare l'accessibilità mi dà eventi chiave globali, ma non quando Controllo missione è attivo. –
Ti consiglio di presentare una segnalazione di bug: developer.apple.com/bugreporter -Also, è meglio consentire ai sostenitori di inventare soluzioni piuttosto che chiedere qualcosa di specifico. Detto questo, il bug report dovrebbe solo identificare il problema in modo chiaro e conciso. – Bobjt