NSEvent单击右侧菜单

时间:2013-04-30 18:49:43

标签: objective-c right-click nsmenuitem nsmenu

在菜单上向右或向左单击时,我使用此代码有两种不同的行为。

点击左侧点击右侧+ cmd

如何在不按最简单的方式按下cmd +单击的情况下右键单击?

-(void)awakeFromNib {

NSImage *image = [NSImage imageNamed:@"menubar"];
NSImage *alternateImage = [NSImage imageNamed:@"menubar-white"];

statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
[statusItem setHighlightMode:YES];
[statusItem setImage:image];
[statusItem setAlternateImage:alternateImage];
[statusItem setAction:@selector(show)];
}


- (void)show {

NSLog(@"call show");

NSEvent *event = [NSApp currentEvent];
//Respond to the mouse click
if ([event modifierFlags] & NSCommandKeyMask) //Command
{
    NSLog(@"RIGHT");
    [statusItem setMenu:statusMenu];
}
else {
    NSLog(@"LEFT");
    //open window
}
}

menu click right

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

我不同意亚伦。通常,您应该避免检查瞬时鼠标或键盘状态。它可能在您实际应该响应的动作之后的时间内发生了变化。例如,如果用户左键单击然后释放鼠标按钮,则+pressedMouseButtons可能会在您的代码调用它时返回0

相反,您应该检查触发当前处理的事件。要进行左键单击,您将获得typeNSLeftMouseDown的活动。右键单击,您将获得NSRightMouseDown。如果您已经知道某种鼠标点击事件,并且由于某种原因不希望检查其类型,则可以检查其buttonNumber属性。

事实上,是什么调用了你的-show方法?我希望你已经在某处实现了NSResponder方法-mouseDown:。如果是,则对应于左键单击。如果用户右键单击,则会调用另一种方法(-rightMouseDown:)。因此,如果您想要不同的响应,通常应该以不同的方式对这两种方法进行编码。

答案 1 :(得分:3)

检查[NSEvent pressedMouseButtons]而不是修饰符标志。让系统负责决定点击哪个按钮。如果按照现在尝试的方式进行操作,对于实际使用多按钮鼠标的用户来说,这会产生奇怪的行为。

你应该能够使用这样的东西:

const NSUInteger pressedButtonMask = [NSEvent pressedMouseButtons];
const BOOL leftMouseDown = (pressedButtonMask & (1 << 0)) != 0;
const BOOL rightMouseDown = (pressedButtonMask & (1 << 1)) != 0;