2012-01-27 2 views
6

Je souhaite réagir en appuyant sur la touche d'accès rapide en affichant NSMenu à la position du curseur de la souris. L'application est UIElement et n'a pas sa propre fenêtre.Comment puis-je afficher NSMenu à la position du curseur de la souris?

Je sais qu'il ya la méthode de NSMenu:

-(void)popUpContextMenu:(NSMenu *)menu 
       withEvent:(NSEvent *)event 
       forView:(NSView *)view; 

Mais il semble que cela ne fonctionne pas quand il n'y a pas de vue :(

Dois-je créer une vue transparente de faux à la position du curseur de la souris. , puis afficher y NSMenu, ou il y a une meilleure façon?

mai, il peut être mis en œuvre à l'aide de carbone?

+0

Avez-vous essayé de créer une vue transparente de faux? Ce qui se produit? –

+0

@RobKeniger - J'ai posté une solution. Ça marche. – flagman

Répondre

14

Utilisez ce lieu:

[theMenu popUpMenuPositioningItem:nil atLocation:[NSEvent mouseLocation] inView:nil]; 
1

Voici une solution qui utilise la fenêtre transparente:

+ (NSMenu *)defaultMenu { 
    NSMenu *theMenu = [[[NSMenu alloc] initWithTitle:@"Contextual Menu"] autorelease]; 
    [theMenu insertItemWithTitle:@"Beep" action:@selector(beep:) keyEquivalent:@"" atIndex:0]; 
    [theMenu insertItemWithTitle:@"Honk" action:@selector(honk:) keyEquivalent:@"" atIndex:1]; 
    return theMenu; 
} 

- (void) hotkeyWithEvent:(NSEvent *)hkEvent 
{ 
    NSPoint mouseLocation = [NSEvent mouseLocation]; 

    // 1. Create transparent window programmatically. 

    NSRect frame = NSMakeRect(mouseLocation.x, mouseLocation.y, 200, 200); 
    NSWindow* newWindow = [[NSWindow alloc] initWithContentRect:frame 
                styleMask:NSBorderlessWindowMask 
                 backing:NSBackingStoreBuffered 
                 defer:NO]; 
    [newWindow setAlphaValue:0]; 
    [newWindow makeKeyAndOrderFront:NSApp]; 

    NSPoint locationInWindow = [newWindow convertScreenToBase: mouseLocation]; 

    // 2. Construct fake event. 

    int eventType = NSLeftMouseDown; 

    NSEvent *fakeMouseEvent = [NSEvent mouseEventWithType:eventType 
               location:locationInWindow 
              modifierFlags:0 
               timestamp:0 
              windowNumber:[newWindow windowNumber] 
                context:nil 
               eventNumber:0 
               clickCount:0 
               pressure:0]; 
    // 3. Pop up menu 
    [NSMenu popUpContextMenu:[[self class]defaultMenu] withEvent:fakeMouseEvent forView:[newWindow contentView]]; 

}

Il fonctionne, mais je suis toujours à la recherche solution plus élégante.

+0

avez-vous déjà trouvé une meilleure solution? – Wesley

+0

@Wesley Malheureusement pas. Toujours en utilisant cela dans de nombreux projets :( – flagman

+9

Cela semble fonctionner un peu mieux? [TheMenu popUpMenuPositioningItem: nil atLocation: [NSEvent mouseLocation] inView: nil]; – Wesley

Questions connexes