2012-01-27 11 views
6

Fare imleç konumunda NSMenu görüntüleyerek kısayol tuşuna basmak istiyorum.NSMenu'yu fare imleci konumunda nasıl açabilirim?

Benim uygulamam UIElement ve kendi penceresine sahip değil.

Orada biliyorum NSMenu yöntemidir:

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

Ama hiç görünüm :(varken çalışmıyor görünüyor

Ben fare imleci konumunda sahte şeffaf bir görünüm yaratmak mı. ve sonra orada NSMenu görüntülemek veya daha iyi bir yolu var mıdır?

o karbon kullanılarak uygulanabilir miyim?

+0

sahte şeffaf bir görünüm oluştururken denediniz mi? Ne oluyor? –

+0

@RobKeniger - Çözüm gönderdim. İşe yarıyor. – flagman

cevap

14

bunu kullanın yerine:

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

İşte transparan pencere kullanan çözümdür:

+ (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]]; 

}

O inşaat, ama hala daha düzenli bir çözüm arıyorum.

+0

Daha iyi bir çözüm buldunuz mu? – Wesley

+0

@Wesley Ne yazık ki değil. Hala birçok projede bunu kullanarak :( – flagman

+9

Bu biraz daha iyi çalışıyor gibi görünüyor? [TheMenu popUpMenuPositioningItem: nil atLocation: [NSEvent mouseLocation] inView: nil]; – Wesley