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