Objective c 我怎样才能检测到鼠标是否在cocoa中的窗口外?

Objective c 我怎样才能检测到鼠标是否在cocoa中的窗口外?,objective-c,macos,cocoa,Objective C,Macos,Cocoa,正如标题所说,我想知道是否有可能检测到鼠标按钮是否按下。我尝试将此代码放入我的app delegate.m中,但没有成功 - (void)mouseDown:(NSEvent *)theEvent { NSLog(@"hello world!"); } 快速的谷歌搜索告诉我,这种方法只能在NSWindows中使用。然而,有很多方法可以检测鼠标位置是否被按下,如果是的话;我该怎么做呢?Cocoa事件监视器是一条可行之路。 您可以使用它们来跟踪视图层次结构之外的几乎所有类型的鼠标事件 查看

正如标题所说,我想知道是否有可能检测到鼠标按钮是否按下。我尝试将此代码放入我的app delegate.m中,但没有成功

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

快速的谷歌搜索告诉我,这种方法只能在NSWindows中使用。然而,有很多方法可以检测鼠标位置是否被按下,如果是的话;我该怎么做呢?

Cocoa事件监视器是一条可行之路。
您可以使用它们来跟踪视图层次结构之外的几乎所有类型的鼠标事件

查看中的文档,了解如何使用它们以及类似的主题


您可以使用
n事件添加GlobalMonitor或ForeventsMatchingMask

在您的控件中定义:

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;
}

尽管您在问题中提到了
mouseDown
,并接受了一个描述如何设置监视器的答案,但就我从问题的其余部分可以看出,您实际上并不需要在按下鼠标按钮时触发事件,而是只想检查当前是否按下了鼠标按钮

您可以为此使用:

[NSEvent pressedMouseButtons]
这将返回当前按下的鼠标按钮的索引:


返回值1,如果你真的关心鼠标下拉事件,或者如果你真正感兴趣的是你的应用程序失去了激活状态,或者你的一个窗口的主/主状态,那么你应该考虑一下。要检测命令键和鼠标按钮是否已按下:nsLeftMousedDownMask&NSCommandKeyMask?否!您必须在处理程序内部进行检查:mouseEventMonitor=[NSEvent addGlobalMonitorForEventsMatchingMask:((NSLeftMouseDownMask | nsrRightMousedownmask | NSOtherMouseDownMask))处理程序:^(NSEvent*事件){if(event.modifierFlags&NSCommandKeyMask){NSLog@“theEvent1->%@”,事件);}其他{NSLog(@“theEvent2->%@”,事件);}}];也许你也能帮我回答这个问题:嘿,又来了。看起来你的代码有时不起作用。然而,它在80%的时间里都能工作。知道原因是什么吗?