Cocoa: Right Click NSStatusItem

前端 未结 3 1827
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-03 02:10

I am a .Net developer who need to port a small project into Mac, so I know next to nothing about Objective C. In fact the code below was just a bunch of grasping at straws a

相关标签:
3条回答
  • 2020-12-03 02:37

    A more simplified response (Note, only works with control + click)

    Properties:

    @property (strong, nonatomic) NSStatusItem *statusItem;
    @property (weak) IBOutlet NSMenu *statusMenu;
    

    In Your Application Did Load:

    [self.statusItem setAction:@selector(itemClicked:)];
    

    Clicked Function:

    - (void)itemClicked:(id)sender
    {
        NSEvent *event = [NSApp currentEvent];
    
        if([event modifierFlags] & NSControlKeyMask) {
            NSLog(@"Right Click Pressed");
            [self.statusItem popUpStatusItemMenu:self.statusMenu];
    
        } else {
            // Do Nothing
            NSLog(@"Left Click Pressed");
        }
    }
    
    0 讨论(0)
  • 2020-12-03 02:49

    I would create a view and use the status items method.

    -setView:
    

    Then in the subclassed view you can detect ctrl+LMB using the following

    - (void)mouseDown:(NSEvent *)theEvent
    {
        [super mouseDown:theEvent];
    
        //Respond to the mouse click
        if ([theEvent modifierFlags] & NSCommandKeyMask) //Command + LMB
        {       
          //Do something
        }
    }
    

    I think you can figure out the rest.

    0 讨论(0)
  • 2020-12-03 02:51

    If you will be satisfied with detecting control-click and not right click, then the first block of code will do what you want. If you really need the right click detection, you will have to use a custom view instead of an image in your NSStatusItem, and the second block of code will work.

    Simple Method:

    - (void)openWin:(id)sender {
        NSEvent *event = [NSApp currentEvent];
        if([event modifierFlags] & NSControlKeyMask) {
            [self openRightWindow:nil];
        } else {
            [self openLeftWindow:nil];
        }
    }
    

    Custom view method:

    - (void)awakeFromNib {
        ...
        statusImage = ...
        MyView *view = [MyView new];
        view.image = statusImage;
        [statusItem setView:view];
        [statusItem setToolTip:@"Program Name"];
        view target = self;
        view action = @selector(openLeftWindow:);
        view rightAction = @selector(openRightWindow:);
        [view release];
        //[statusImage release]; //If you are not using it anymore, you should release it.
    }
    
    MyView.h
    
    #import <Cocoa/Cocoa.h>
    @interface MyView : NSControl {
        NSImage *image;
        id target;
        SEL action, rightAction;
    }
    @property (retain) NSImage *image;
    @property (assign) id target;
    @property (assign) SEL action, rightAction;
    @end
    
    MyView.m
    
    #import "MyView.h"
    @implementation MyView
    @synthesize image, target, action, rightAction;
    - (void)mouseUp:(NSEvent *)event {
        if([event modifierFlags] & NSControlKeyMask) {
            [NSApp sendAction:self.rightAction to:self.target from:self];
        } else {
            [NSApp sendAction:self.action to:self.target from:self];
        }
    }
    - (void)rightMouseUp:(NSEvent *)event {
        [NSApp sendAction:self.rightAction to:self.target from:self];
    }
    - (void)dealloc {
        self.image = nil;
        [super dealloc];
    }
    - (void)drawRect:(NSRect)rect {
        [self.image drawInRect:self.bounds fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
    }
    @end
    
    0 讨论(0)
提交回复
热议问题