屏幕上的NSStatusItem(可可)位置

时间:2009-11-09 22:00:50

标签: cocoa nsstatusitem

我正在尝试获取NSStatusItem的屏幕位置,以便我可以通过下面的代码对该区域执行单击。我这样做是为了让我的用户可以按热键查看菜单。

event = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, newLocation, kCGMouseButtonLeft);
CGEventPost(kCGHIDEventTap, event);
CFRelease(event);

有没有人知道如何获得这个位置?我一直在尝试创意并寻找好几天并找到了几个想法,但它们似乎都不适用于豹/雪豹

NSStatusItem正在使用NSMenu而不是自定义视图。

2 个答案:

答案 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: