在菜单上向右或向左单击时,我使用此代码有两种不同的行为。
点击左侧,点击右侧+ 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
}
}
感谢您的帮助!
答案 0 :(得分:5)
我不同意亚伦。通常,您应该避免检查瞬时鼠标或键盘状态。它可能在您实际应该响应的动作之后的时间内发生了变化。例如,如果用户左键单击然后释放鼠标按钮,则+pressedMouseButtons
可能会在您的代码调用它时返回0
。
相反,您应该检查触发当前处理的事件。要进行左键单击,您将获得type
为NSLeftMouseDown
的活动。右键单击,您将获得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;