Cocoa 选择popUpContextMenu中的第一项

Cocoa 选择popUpContextMenu中的第一项,cocoa,contextmenu,macos-carbon,nsmenu,nsmenuitem,Cocoa,Contextmenu,Macos Carbon,Nsmenu,Nsmenuitem,我在一个键盘密集型应用程序上工作。双手放在键盘上。不要把手放在鼠标上 用户可以通过键盘弹出关联菜单,选择一个项目,最后按enter键 [NSMenu popUpContextMenu]显示菜单而不突出显示任何项目。用户必须按下向下箭头一次才能突出显示第一项 我的一位朋友观察到,每次使用此菜单时,您都必须按下arrow_向下键 建议我删除此步骤,以便在弹出菜单时始终突出显示第一项 我怀疑这需要碳黑客 如何以编程方式突出显示第一项? 我用这个代码弹出一个菜单 NSEvent* event = [N

我在一个键盘密集型应用程序上工作。双手放在键盘上。不要把手放在鼠标上

用户可以通过键盘弹出关联菜单,选择一个项目,最后按enter键

[NSMenu popUpContextMenu]
显示菜单而不突出显示任何项目。用户必须按下向下箭头一次才能突出显示第一项

我的一位朋友观察到,每次使用此菜单时,您都必须按下arrow_向下键 建议我删除此步骤,以便在弹出菜单时始终突出显示第一项

我怀疑这需要碳黑客

如何以编程方式突出显示第一项?


我用这个代码弹出一个菜单

NSEvent* event = [NSEvent otherEventWithType:NSApplicationDefined
    location:location 
    modifierFlags:0 
    timestamp:0
    windowNumber:[[self window] windowNumber]
    context:[[self window] graphicsContext]
    subtype:100
    data1:0
    data2:0
];
[NSMenu popUpContextMenu:menu withEvent:event forView:self];

更新:我尝试在popUpContextMenu之后发送一个arrow_down事件给我的应用程序,但是当菜单可见时,该事件不会执行。(该事件在菜单消失后执行)


我找到了我原来问题的答案。但是它有问题,我认为有必要解决这些问题

  • 问题:如何绘制菜单 项目,使其看起来像本机菜单 项目
  • 问题:一个人是如何做出决定的 自定义视图的行为与普通视图相同 menuitem。。现在你必须 向下按两次箭头_可获得 选择下一项
  • 如何解决这些问题

    @interface MyMenuItem : NSView {
        BOOL m_active;
    }
    @end
    
    @implementation MyMenuItem
    - (BOOL)acceptsFirstResponder { return YES; }
    - (BOOL)becomeFirstResponder { m_active = YES; return YES; }
    - (BOOL)resignFirstResponder { m_active = NO; return YES; }
    
    - (void)viewDidMoveToWindow { [[self window] makeFirstResponder:self]; }
    
    - (void)drawRect:(NSRect)rect {
        if(m_active) {
            [[NSColor blueColor] set];
        } else {
            [[NSColor blackColor] set];
        }
        NSRectFill(rect);
    }
    @end
    
    
    // this makes sure the first item gets selected when the menu popups
    MyMenuItem* view = [[[MyMenuItem alloc] initWithFrame:NSMakeRect(0, 0, 100, 20)] autorelease];
    [view setAutoresizingMask:NSViewWidthSizable];
    NSMenuItem* item = [menu itemAtIndex:0];
    [item setView:view];
    [NSMenu popUpContextMenu:menu withEvent:event forView:self];
    

    解决它!!!忘了上面所有的东西。我刚刚找到了一个优雅的解决方案,根本不需要碳

    // simulate a key press of the arrow-down key
    CGKeyCode key_code = 125;  // kVK_DownArrow = 125
    CGEventRef event1, event2;
    event1 = CGEventCreateKeyboardEvent(NULL, key_code, YES);
    event2 = CGEventCreateKeyboardEvent(NULL, key_code, NO);
    CGEventPost(kCGSessionEventTap, event1);
    CGEventPost(kCGSessionEventTap, event2);
    CFRelease(event1);
    CFRelease(event2);
    
    [NSMenu popUpContextMenu:menu withEvent:event forView:self];
    

    请注意,如果您的目标是10.6及更高版本,请不要使用class方法
    popUpContextMenu
    ,而是使用实例的
    popupmenuppositioningitem:atLocation:inView:
    。 如果您指定
    positioningItem
    ,它将被自动选择。当然,您需要重新计算相对于所选项目的位置

    // simulate a key press of the arrow-down key
    CGKeyCode key_code = 125;  // kVK_DownArrow = 125
    CGEventRef event1, event2;
    event1 = CGEventCreateKeyboardEvent(NULL, key_code, YES);
    event2 = CGEventCreateKeyboardEvent(NULL, key_code, NO);
    CGEventPost(kCGSessionEventTap, event1);
    CGEventPost(kCGSessionEventTap, event2);
    CFRelease(event1);
    CFRelease(event2);
    
    [NSMenu popUpContextMenu:menu withEvent:event forView:self];