2008-09-24 6 views
11

Les applications OSX normales mangent le premier clic de la souris lorsqu'elles ne sont pas concentrées pour effectuer la première mise au point de l'application. Ensuite, les futurs clics sont traités par l'application. Le bouton iTunes play/pause et le Finder se comportent différemment, le premier clic est activé même s'il n'est pas focalisé. Je cherche un moyen de forcer une application existante (Remote Desktop Connection.app) à agir sur le premier clic et pas seulement sur le focus.Faire que l'application OSX réponde au premier clic de la souris lorsqu'elle n'est pas focalisée

+0

Vos exemples ne sont pas entièrement corrects. iTunes ne prend en charge que les clics dans certains endroits, comme lorsque la fenêtre est en mode mini. – benzado

Répondre

4

Répondre au premier clic de la souris lorsqu'il n'est pas focalisé s'appelle 'click through'. Et sa valeur est vivement débattue, par exemple here et here.

14

Cochez la case acceptFirstMouse de NSView, c'est peut-être ce que vous cherchez.

acceptedFirstMouse: Surchargé par les sous-classes pour renvoyer YES si le récepteur doit recevoir un message mouseDown: pour un événement de souris initial, NO sinon.

  • (booléen) acceptsFirstMouse: (NSEvent *) theEvent

Paramètres theEvent Le __gVirt_NP_NN_NNPS<__ événement de souris vers le bas initial, qui doit être sur le récepteur dans sa fenêtre.

Discussion Le destinataire peut renvoyer une valeur sans condition ou utiliser l'emplacement de l'événement pour déterminer s'il souhaite ou non l'événement. L'implémentation par défaut ignore theEvent et renvoie NO. Remplacez cette méthode dans une sous-classe pour permettre aux instances de répondre aux clics. Cela permet à l'utilisateur de cliquer sur une vue dans une fenêtre inactive, en activant la vue en un clic, au lieu de cliquer d'abord pour rendre la fenêtre active, puis en cliquant sur la vue. La plupart des objets de vue refusent une tentative de clic, de sorte que l'événement active simplement la fenêtre. Toutefois, de nombreux objets de contrôle, tels que NSButton et NSSlider, les acceptent, ce qui permet à l'utilisateur de manipuler immédiatement le contrôle sans avoir à relâcher le bouton de la souris.

0

// En supposant que vous ayez un contrôleur de vue qui traîne toujours. Plus rouler le loadview. N.B. cela ne fonctionnera pas pré-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

C'est une solution, franchement, sans espoir. –

+0

Vous pourriez essayer de surcharger le contenu de nswindow pour le rendre moins fragile. – johndpope

Questions connexes