0

我有一个全屏透明窗口,显示在我的应用程序主菜单上方。它已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;
}

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

但是,即使单击主菜单栏时日志确实显示“单击”,单击也没有效果。例如,如果我单击一个菜单项(例如“文件”菜单项),它将不会打开相应的菜单(在本例中为文件菜单)。

我究竟做错了什么?

4

1 回答 1

3

一个事件的目标窗口是在你的应用程序接收到它之前由窗口服务器决定的。调用时尚未决定-sendEvent:。的主要作用-setIgnoresMouseEvents:是通知窗口服务器,而不是 Cocoa 的内部,如何调度鼠标事件。

除了事件点击之类的东西,一旦你收到了一个事件,再重新定位它就太晚了。

请注意,例如,NSEvent-window您调用-sendEvent:. -sendEvent:只是要使用它来调度它。

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

于 2013-08-04T02:10:08.487 回答