2009-11-09 18 views
3

J'essaie d'obtenir l'emplacement à l'écran d'un NSStatusItem afin que je puisse effectuer un clic sur cette zone via le code ci-dessous. Je fais cela pour que mes utilisateurs puissent appuyer sur un raccourci clavier pour voir le menu.Emplacement NSStatusItem (cacao) à l'écran

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

Quelqu'un connaît un moyen d'obtenir l'emplacement ?, J'ai essayé des idées et la recherche de jours et ont trouvé plusieurs idées, mais aucun d'entre eux semblent travailler dans le léopard/léopard des neiges

Le NSStatusItem utilise un NSMenu pas une vue personnalisée.

+0

Il n'y a rien de public pour cela, et cela ne devrait probablement pas être fait en premier lieu. –

Répondre

3

Ne faites pas cela en simulant un événement de souris, c'est complètement le mauvais chemin à parcourir. Vous pouvez utiliser la méthode -popUpStatusItemMenu: de NSStatusItem pour afficher le menu. Vous pouvez appeler cette méthode à partir d'une touche d'accès rapide en utilisant un CGEventTap pour capturer des événements globaux auxquels votre NSStatusItem peut répondre.

Le 10.6, vous pouvez utiliser la méthode +addGlobalMonitorForEventsMatchingMask:handler: de NSEvent pour capturer des événements globaux au lieu d'utiliser CGEventTap directement.

+0

Merci d'avoir répondu, j'utilise popUpStatusItemMenu: déjà mais le seul inconvénient est qu'il ne met pas en évidence le nsstatusitem alors j'essayais de trouver une alternative. Je pense que je devrais juste me contenter de popUpStatusItemMenu – Craig

+0

'addGlobalMonitorForEventsMatchingMask: handler:' est pour surveiller les événements, ne les affiche pas, ce qui est ce qu'il fait avec l'événement appuyez sur l'exemple de la question. De plus, ce n'est pas la manière la plus simple d'implémenter un raccourci clavier; ce serait Carbon Event Manager, dont l'API hotkey est toujours supportée (même en 64 bits). –

0

En réfléchissant à haute voix, vous pouvez créer votre propre vue personnalisée pour NSStatusItem. Puis par exemple à partir de l'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]]; 

Et pour simuler la surbrillance, vous enverriez un message à votre vue personnalisée. Puis, quand le dessin MyCustomView:

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

Outre l'utilisation -popUpStatusItemMenu:.