3

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

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

有谁知道获取位置的方法?,我一直在尝试想法并搜索几天,并找到了几个想法,但似乎没有一个适用于豹/雪豹

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

4

2 回答 2

3

不要通过模拟鼠标事件来做到这一点,那是完全错误的方法。

您可以使用 的-popUpStatusItemMenu:方法NSStatusItem来显示菜单。您可以从热键调用此方法,方法是使用 a来捕获您可以响应的CGEventTap全局事件。NSStatusItem

在 10.6 上,您可以使用 的+addGlobalMonitorForEventsMatchingMask:handler:方法NSEvent来捕获全局事件,而不是CGEventTap直接使用。

于 2009-11-10T10:43:25.240 回答
0

Thinking out loud you could create your own custom view for the NSStatusItem. Then for example from the 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]];

And to simulate the highlight you'd send a message to your custom view. Then when drawing MyCustomView:

// In MyCustomView.m
- (void)drawRect:(NSRect)rect {
if (clicked) {
    [[NSColor selectedMenuItemColor] set];
    NSRectFill(rect);
}

As well as using -popUpStatusItemMenu:.

于 2010-03-27T11:25:47.443 回答