我正在尝试获取NSStatusItem的屏幕位置,以便我可以通过下面的代码对该区域执行单击。我这样做是为了让我的用户可以按热键查看菜单。
event = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, newLocation, kCGMouseButtonLeft);
CGEventPost(kCGHIDEventTap, event);
CFRelease(event);
有没有人知道如何获得这个位置?我一直在尝试创意并寻找好几天并找到了几个想法,但它们似乎都不适用于豹/雪豹
NSStatusItem正在使用NSMenu而不是自定义视图。
答案 0 :(得分:3)
不要通过模拟鼠标事件来做到这一点,这完全是错误的方法。
您可以使用-popUpStatusItemMenu:
的{{1}}方法来显示菜单。您可以使用NSStatusItem
从热键调用此方法,以捕获CGEventTap
可以响应的全局事件。
在10.6上,您可以使用NSStatusItem
+addGlobalMonitorForEventsMatchingMask:handler:
方法捕获全局事件,而不是直接使用NSEvent
。
答案 1 :(得分:0)
大声思考你可以为NSStatusItem创建自己的自定义视图。然后例如从AppController:
- (void)awakeFromNib {
float width = 30.0;
float height = [[NSStatusBar systemStatusBar] thickness];
NSRect viewFrame = NSMakeRect(0, 0, width, height);
statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:width] retain];
[statusItem setView:[[[MyCustomView alloc] initWithFrame:viewFrame controller:self] autorelease]];
要模拟突出显示,您需要向自定义视图发送消息。然后绘制MyCustomView:
// In MyCustomView.m
- (void)drawRect:(NSRect)rect {
if (clicked) {
[[NSColor selectedMenuItemColor] set];
NSRectFill(rect);
}
以及使用-popUpStatusItemMenu:
。