2008-09-24 17 views
11

Zwykłe aplikacje OSX zjadają pierwsze kliknięcie myszą, gdy nie są skupione na pierwszym ustawieniu ostrości aplikacji. Następnie przyszłe kliknięcia są przetwarzane przez aplikację. Przycisk play/pause iTunes i Finder zachowują się inaczej, pierwsze kliknięcie działa, nawet gdy nie jest ustawione. Szukam sposobu zmuszenia istniejącej aplikacji (Remote Desktop Connection.app) do działania na pierwszym kliknięciu, a nie tylko skupienia.Spraw, aby aplikacja OSX reagowała na pierwsze kliknięcie myszą, gdy nie jest aktywna.

+0

Twoje przykłady nie są całkowicie poprawne. iTunes obsługuje klikanie tylko w kilku miejscach, np. gdy okno jest w trybie mini. – benzado

Odpowiedz

4

Reagowanie na pierwsze kliknięcie myszą, gdy nie jest ono skupione, nazywa się "kliknięciem". A jego wartość jest przedmiotem gorących dyskusji, na przykład here i here.

14

Sprawdź, czy NSView akceptujeFirstMouse, może być tym, czego szukasz.

acceptsFirstMouse: Zastąpiony przez podklasy, aby powrócić TAK, jeśli odbiornik ma zostać wysłany jako mouseDown: wiadomość o początkowym zdarzeniu, NIK, jeśli nie.

  • (Bool) acceptsFirstMouse (NSEvent *) theEvent

Parametry theEvent Początkowe zdarzenia myszy w dół, która musi być przez odbiornik w każdym oknie.

Dyskusja Odbiornik może albo zwrócić wartość bezwarunkowo, albo użyć lokalizacji zdarzenia, aby określić, czy chce tego zdarzenia. Domyślna implementacja ignoruje zdarzenia i zwraca wartość NIE.

Zastąp tę metodę w podklasie, aby umożliwić instancji reagowanie na kliknięcia. Dzięki temu użytkownik może kliknąć widok w nieaktywnym oknie, aktywując widok za pomocą jednego kliknięcia, zamiast klikać najpierw, aby okno było aktywne, a następnie klikając widok. Większość obiektów widoku odrzuca próbę kliknięcia, więc wydarzenie po prostu aktywuje okno. Wiele obiektów kontrolnych, takich jak instancje NSButton i NSSlider, akceptuje je, więc użytkownik może natychmiast manipulować formantem bez konieczności zwolnienia przycisku myszy.

0

// Zakładając, że masz 1 kontroler widoku, który zawsze się kręci. Over ride the loadview. N.B. to nie zadziała pre-yosemite.

- (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

To jest, szczerze mówiąc, beznadziejne rozwiązanie. –

+0

Możesz spróbować przesłonić widok zawartości nswindow, aby był mniej delikatny. – johndpope