2008-09-24 6 views
11

Normale OSX-Anwendungen essen den ersten Mausklick, wenn sie sich nicht auf die Anwendung konzentrieren. Dann werden zukünftige Klicks von der Anwendung verarbeitet. iTunes Play/Pause-Taste und Finder verhalten sich anders, der erste Klick wird aktiviert, auch wenn nicht fokussiert. Ich bin auf der Suche nach einer Möglichkeit zum Erzwingen einer vorhandenen Anwendung (Remote Desktop Connection.app) auf den ersten Klick und nicht nur zu konzentrieren.Lassen Sie die OSX-Anwendung auf den ersten Mausklick reagieren, wenn sie nicht fokussiert ist

+0

Ihre Beispiele sind nicht ganz korrekt. iTunes unterstützt nur das Durchklicken an einigen Stellen, z. B. wenn sich das Fenster im Mini-Modus befindet. – benzado

Antwort

4

Die Reaktion auf den ersten Mausklick, wenn nicht fokussiert, wird "Klick durch" genannt. Und sein Wert wird heiß debattiert, zum Beispiel here und here.

14

Prüfen Sie, ob NSViews acceptsFirstMouse das ist, wonach Sie suchen.

acceptsFirstMouse: Überschrieben von Unterklassen, um YES zurückzugeben, wenn dem Empfänger eine mouseDown gesendet werden soll: Nachricht für ein initiales Mouse-Down-Ereignis, NO, falls nicht.

  • (BOOL) acceptsFirstMouse: (NSEvent *) theEvent

Parameter theEvent Die anfängliche Maus-Down-Ereignis, die über den Empfänger in seinem Fenster sein müssen.

Diskussion Der Empfänger kann einen Wert entweder bedingungslos zurückgeben oder den Speicherort des Ereignisses verwenden, um festzustellen, ob das Ereignis gewünscht wird oder nicht. Die Standardimplementierung ignoriert theEvent und gibt NO zurück.

Überschreiben Sie diese Methode in einer Unterklasse, damit Instanzen auf Click-through reagieren können. Dadurch kann der Benutzer auf eine Ansicht in einem inaktiven Fenster klicken und die Ansicht mit einem Klick aktivieren, anstatt zuerst auf das Fenster zu klicken und dann auf die Ansicht zu klicken. Die meisten Ansichtsobjekte verweigern einen Klickversuch, sodass das Ereignis das Fenster einfach aktiviert. Viele Steuerelementobjekte, wie z. B. Instanzen von NSButton und NSSlider, akzeptieren sie jedoch, sodass der Benutzer das Steuerelement sofort bearbeiten kann, ohne die Maustaste loslassen zu müssen.

0

// Angenommen, Sie haben 1 View-Controller, der immer herumhängt. Überfahren Sie die Lastansicht. N.B. das wird nicht vor dem Yosemite funktionieren.

- (void)loadView { 
    NSLog(@"loadView"); 


    self.view = [[NSView alloc] initWithFrame: 
       [[app.window contentView] frame]]; 
    [self.view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; 

    int opts = (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways); 
    trackingArea0 = [[NSTrackingArea alloc] initWithRect:self.view.bounds 
               options:opts 
                owner:self 
               userInfo:nil]; 
    [self.view addTrackingArea:trackingArea0]; 


} 
- (void)mouseEntered:(NSEvent *)theEvent { 
    NSLog(@"entered"); 


     if ([[NSApplication sharedApplication] respondsToSelector:@selector(activateIgnoringOtherApps:)]) { 
      [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; 
     } 

} 
+0

Dies ist eine, ehrlich gesagt, hoffnungslose Lösung. –

+0

Sie könnten versuchen, die Inhaltsansicht von nswindow zu überschreiben, um sie weniger anfällig zu machen. – johndpope