Расположение NSStatusItem (какао) на экране - PullRequest
3 голосов
/ 10 ноября 2009

Я пытаюсь получить на экране местоположение NSStatusItem, чтобы я мог выполнить щелчок по этой области с помощью кода, как показано ниже. Я делаю это так, чтобы мои пользователи могли нажать горячую клавишу, чтобы увидеть меню.

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

Кто-нибудь знает способ получить местоположение? Я пробовал идеи и искал несколько дней и нашел несколько идей, но ни одна из них, похоже, не работает в леопарде / снежном барсе

NSStatusItem использует NSMenu, а не пользовательское представление.

Ответы [ 2 ]

3 голосов
/ 10 ноября 2009

Не делайте этого, имитируя событие мыши, это совершенно неверный путь.

Вы можете использовать -popUpStatusItemMenu: метод NSStatusItem для отображения меню. Вы можете вызвать этот метод с помощью горячей клавиши, используя CGEventTap для захвата глобальных событий, на которые ваш NSStatusItem может ответить.

На 10.6 вы можете использовать +addGlobalMonitorForEventsMatchingMask:handler: метод NSEvent для захвата глобальных событий вместо прямого использования CGEventTap.

0 голосов
/ 27 марта 2010

Думая вслух, вы можете создать свой собственный вид для 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:.

...