Как я могу открыть NSMenu в позиции курсора мыши? - PullRequest
6 голосов
/ 27 января 2012

Я хочу реагировать на нажатие горячей клавиши, отображая NSMenu в позиции курсора мыши.

Мое приложение UIElement и не имеет собственного окна.

Я знаю, что есть метод NSMenu:

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

Но кажется, что это не работает, когда нет представления :(.

Должен ли я создать фальшивый прозрачный вид в позиции курсора мыши, а затем отобразить там NSMenu, или есть лучший способ?

Может ли это быть реализовано с помощью Carbon?

Ответы [ 2 ]

16 голосов
/ 19 апреля 2014

Используйте это вместо:

  [theMenu popUpMenuPositioningItem:nil atLocation:[NSEvent mouseLocation] inView:nil];
1 голос
/ 30 января 2012

Вот решение, которое использует прозрачное окно:

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

}

Это работает, но я все еще ищу более элегантное решение.

...