2009-11-09 58 views
3

我想獲得NSStatusItem的屏幕位置,以便通過下面的代碼執行點擊該區域的操作。我正在這樣做,以便我的用戶可以按熱鍵來查看菜單。屏幕上的NSStatusItem(可可)位置

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

有誰知道的一種方式來獲得位置?我一直在努力的想法和尋找了幾天,發現了一些想法,但他們都不在豹工作/雪豹

的NSStatusItem使用NSMenu而不是自定義視圖。

+0

沒有什麼公開的,它可能不應該在第一時間完成。 –

回答

3

不要通過模擬鼠標事件來做到這一點,那是完全錯誤的做法。

您可以使用-popUpStatusItemMenu:方法NSStatusItem來顯示菜單。您可以通過使用CGEventTap來捕獲您的NSStatusItem可以響應的全局事件,從熱鍵調用此方法。

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

+0

感謝您的回答,我正在使用popUpStatusItemMenu:已經但唯一的缺點是它不突出顯示nsstatusitem,所以我試圖找到替代方案。我想我只需要解決popUpStatusItemMenu – Craig

+0

'addGlobalMonitorForEventsMatchingMask:handler:'用於監視事件,而不是發佈它們,這就是他在問題示例中使用事件點擊做的事情。而且,這不是實現熱鍵的最簡單的方法;那將是碳事件管理器,其熱鍵API仍然受支持(即使在64位中)。 –

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: