2011-01-05 2 views
2

Ich möchte Schlüsselwert mit Cocoa bekommen, wenn nicht auf Fenster konzentrieren. Wenn Sie es wissen, bitte unterrichten Sie mich.Wie Schlüsselwert mit Cocoa erhalten, unabhängig von Fokus auf Fenster oder nicht

+0

Ich bin nicht sicher, wie man das in Kakao macht, aber Sie müssen die Tastatur direkt abfragen. Wenn Sie keinen Fokus haben, werden die Tastatur-Tastenanschläge nicht an Sie gesendet, es sei denn, Sie haben einen unterschiedlichen Modus für das Abfangen von Nachrichten. – EnabrenTane

+0

Mit OSX 10.6 können Sie sich weltweit für Tastaturereignisse registrieren - siehe Dave DeLongs Antwort und meine Antwort. –

Antwort

0

Ich vor kurzem asked this question und verwendet addGlobalMonitorForEventsMatchingMask, genau wie Dave Delong vorschlägt, wies mich @NSGod darauf hin.

hatte ich Probleme herauszufinden, die Block-Syntax aus, obwohl, so dass ich aus dem Code zitiere ich zu dieser Antwort geschrieben:

 // register for keys throughout the device... 
    [NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(struct NSEvent *event){ 

    NSString *chars = [[event characters] lowercaseString]; 
    unichar character = [chars characterAtIndex:0]; 

    NSLog(@"keydown globally! Which key? This key: %c", character); 

    }]; 

Die Sache mit Blöcken im Auge zu behalten ist, dass sie direkt geliefert werden zum Methodenaufruf. Ich habe eine ausführlichere Beschreibung an my own question angefügt, aber wenn Sie die obige Syntax folgen und den Block als eine Art 'Inline-Delegate-Methode' betrachten, sollten Sie es gut machen.

1

Um entweder addGlobalMonitorForEventsMatchingMask oder CGEventTap zu verwenden, muss Ihre Anwendung als root ausgeführt werden. Ich konnte die NSEvent-Methode nicht für mich arbeiten lassen, aber die CGEventTap funktionierte als root.

Die Vorteile der CGEventTap Methode sind:

  • Sie alle Veranstaltungen erhalten, besitzen Anwendung diejenigen von Ihnen selbst. (Die andere Methode sendet Ihnen keine eigenen Ereignisse.)
  • Sie können Ereignisse auf verschiedenen Ebenen (vor dem Fensterserver, vor dem Sitzungsserver usw.) antippen
  • Sie können die Ereignisse bei Bedarf ändern.