Question

As the titles says i wonder if it is possible to detect if the mouse button is down. I tried putting this code in my app delegate.m but with no success.

- (void)mouseDown:(NSEvent *)theEvent
{
    NSLog(@"hello world!");
}

A quick google search showed me that this method only works inside of NSWindows. However, there most be some way to detect if mouse position is pressed, and if so; how can i do it?

Was it helpful?

Solution

You can use NSEvent addGlobalMonitorForEventsMatchingMask:

define in your control:

id mouseEventMonitor;

-(id)init{

    mouseEventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDownMask | NSRightMouseDownMask | NSOtherMouseDownMask)
                                           handler:^(NSEvent *event){

        NSLog(@"theEvent->%@",event);

        //here you will receive the all mouse DOWN events
        if (event.modifierFlags & NSCommandKeyMask)
        {
          NSLog(@"theEvent1->%@",event);
        }else{
          NSLog(@"theEvent2->%@",event);
        }

    }];

    return self;
}

OTHER TIPS

Cocoa Event Monitors are the way to go.
You can use them to track pretty much every kind of mouse event outside of your view hierarchy.

Check out the documentation in the Cocoa Event Handling Guide for information on how to use them and similar topics here on SO like

Although you mention mouseDown in your question and have accepted an answer that describes how to set up a monitor, as far as I can tell from the rest of the question, you don't actually need an event that fires when the mouse button is pressed, but instead just want to check if a mouse button is currently pressed.

NSEvent has a class property you can use for this:

[NSEvent pressedMouseButtons]

This returns the indices of the currently pressed mouse buttons:

A return value of 1 << 0 corresponds to the left mouse button, 1 << 1 corresponds to the right mouse button, 1<< n, n >=2 correspond to other mouse buttons.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top