2012-02-19 3 views
17

Sto tentando di utilizzare CGAssociateMouseAndMouseCursorPosition (NO) in un programma. Questo disconnette il mouse dal cursore sullo schermo quando l'applicazione è "in primo piano". Sfortunatamente lo disconnette anche quando Mission Control o lo switcher dell'applicazione o chissà cos'altro.Come si può rilevare il controllo Missione o il commutatore della scheda di comando che sostituisce il proprio programma in OS X?

Finora so:

  • L'applicazione è ancora attiva.
  • La finestra è ancora la chiave.
  • Non viene inviato nulla al centro di notifica predefinito quando si verificano questi problemi.
  • L'applicazione interrompe la ricezione di eventi spostati dal mouse, ma un NSEvent addGlobalMonitorForEventsMatchingMask: handler: inoltre non li riceve, il che è a dir poco strano. Dovrebbe ricevere tutti gli eventi non consegnati alla mia domanda. (Avevo intenzione di rilevare gli eventi mancanti per sapere quando associare nuovamente il mouse.

Quindi, c'è un modo per rilevare quando la mia domanda non è più in controllo è, in particolare perché la missione di controllo o l'interruttore ha preso finita? Hanno davvero aspettare il mouse per lavoro e ho bisogno di ripristinare tale associazione per loro.

+0

Per una soluzione grossolana, sia il Controllo missione che lo switcher e presumibilmente qualsiasi altra cosa che utilizza il mouse renderà il cursore nuovamente visibile, quindi il polling CGCursorIsVisible() ti farà sapere che qualcuno si aspetta che il mouse funzioni. Ma sembra un fragile cerotto. – bitmusher

+0

Forse puoi semplicemente disabilitare l'Application Switcher? C'è un'altra domanda riguardo a questa possibilità, e collega un Apple Q & A doc: http://stackoverflow.com/questions/3256651/disable-cmdtab-application-switcher Nulla sul controllo missione lì, però. – febeling

+0

Qualcosa potrebbe andare al centro di notifica di NSWorkspace, ma ne dubito. –

risposta

0

hai provato a chiedere NSRunningApplication?

3

condivido la vostra sorpresa che un monitor evento globale non è vedere gli eventi. In una situazione simile, ho usato uno Quartz Event Tap per uno scopo simile.Il monitor dell'evento globale Cocoa è abbastanza simile ai tocchi di evento, quindi immagino d avrebbe funzionato.

Ho messo il rubinetto su kCGAnnotatedSessionEventTap e ho confrontato il risultato da CGEventGetIntegerValueField(event, kCGEventTargetUnixProcessID) a getpid() per determinare quando gli eventi dovevano passare a un'altra app (ad esempio Controllo missione o Exposé). (Disattivo la scheda quando la mia app abbandona lo stato attivo, quindi dovrebbe ricevere solo eventi destinati a un'altra app quando viene presentato questo tipo di interfaccia utente.)

A proposito, hai menzionato il monitoraggio del centro di notifica predefinito, ma, se c'è una notifica su Controllo missione o simili, è più probabile che arrivi al centro di notifica distribuito (NSDistributedNotificationCenter). Quindi vale la pena controllarlo.

+0

Grazie, immagino che non ci sia davvero un modo migliore. A proposito, ho controllato NSDistributedNotification (passando NULL si ottengono tutte le notifiche) e non ci sono notifiche per il controllo della missione, sfortunatamente). – Wesley

Problemi correlati