2012-01-27 10 views
6

Chcę reagować na naciśnięcie klawisza skrótu, wyświetlając NSMenu na pozycji kursora myszy.Jak mogę wyświetlić NSMenu na pozycji kursora myszy?

Moja aplikacja jest UIElement i nie ma własnego okna.

wiem, że jest metoda NSMenu:

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

Ale wydaje się, że nie działa, gdy nie ma widoku :(

powinienem stworzyć fałszywy przejrzysty widok na pozycji kursora myszy. , a następnie wyświetlać tam NSMenu, czy istnieje lepszy sposób?

może to może być realizowane za pomocą Carbon?

+0

Czy próbowałeś tworzyć fałszywe przejrzystego widoku? Co się dzieje? –

+0

@RobKeniger - wysłałem rozwiązanie. To działa. – flagman

Odpowiedz

14

Użyj tego zamiast:

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

Oto rozwiązanie, które wykorzystuje przezroczyste okienko:

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

}

To działa, ale jestem wciąż szuka bardziej eleganckie rozwiązanie.

+0

czy kiedykolwiek znalazłeś lepsze rozwiązanie? – Wesley

+0

@Wesley Niestety nie. Nadal używa się tego w wielu projektach :( – flagman

+9

To wydaje się działać trochę lepiej? [TheMenu popUpMenuPositioningItem: nil atLocation: [NSEvent mouseLocation] inView: nil]; – Wesley

Powiązane problemy