gpt4 book ai didi

macos - -SendEvent 的行为不符合预期

转载 作者:行者123 更新时间:2023-12-03 17:40:12 26 4
gpt4 key购买 nike

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

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

我做错了什么?

最佳答案

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

除了事件点击之类的事件外,一旦您收到事件,再重新定位它就为时已晚。

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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com