我有一个全屏透明窗口,显示在我的应用程序主菜单上方。 ignoresMouseEvents设置为NO。尽管如此,为了获得鼠标点击,我添加了以下代码:

[NSEvent addLocalMonitorForEventsMatchingMask:NSLeftMouseDownMask handler:^(NSEvent *event) {
    [self click:event];
    return event;
}];


每当用户在我的应用程序处于活动状态时单击时,该方法click称为:

- (BOOL)click:(NSEvent *)event {
    NSPoint coordinate = [event locationInWindow];
    float ycoord = coordinate.y;
    float menuheight = [[NSApp mainMenu] menuBarHeight];
    float windowheight = [[NSApp mainWindow] frame].size.height;
    if (ycoord >= windowheight - menuheight && ![[NSApp mainWindow] ignoresMouseEvents]) {
        [[NSApp mainWindow] setIgnoresMouseEvents:YES];
        [NSApp sendEvent:event];
        NSLog(@"click");
        [[NSApp mainWindow] setIgnoresMouseEvents:NO];
        return YES;
    }
    return NO;
}


如您所见,如果单击主菜单栏,它将把主窗口的ignoresMouseEvents属性更改为YES-之后,它会在sendEvent:中调用NSApplication。最后,它将主窗口的ignoresMouseEvents属性更改回NO。

但是,即使单击主菜单栏时日志中确实显示“单击”,该单击也无效。例如,如果单击菜单项(例如“文件”菜单项),它将不会打开相应的菜单(在这种情况下为文件菜单)。

我究竟做错了什么?

最佳答案

事件所针对的窗口是由窗口服务器确定的,甚至在您的应用程序接收到它之前。调用-sendEvent:时尚未确定。 -setIgnoresMouseEvents:的主要作用是通知窗口服务器(而不是Cocoa内部)如何调度鼠标事件。

除了事件水龙头之类的东西以外,一旦您收到事件,重新定位它就为时已晚。

请注意,例如,在调用NSEvent之前,-window已经具有关联的-sendEvent:-sendEvent:只是用来分配它。

如果要允许在菜单栏中单击,则应调整窗口大小以使其不与菜单栏重叠,或者应将其窗口级别设置为在菜单栏后面。

关于macos - -SendEvent的行为不符合预期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18037631/

10-12 22:01