NSRunningApplication activateWithOptions 方法行为随 Big Sur 发生变化
NSRunningApplication activateWithOptions method behavior change with Big Sur
我正在 MacOS Big Sur 上使用 select windows 的应用程序。 (我有轻微的手颤,导致我经常点击鼠标错过预期的目标。)
应用程序:
- 使用 AppKit“macOS 辅助功能”API 到 select windows。它调用
AXUIElementSetAttributeValue
函数来设置属性 NSAccessibilityMainAttribute
以将特定的 window 放在前面 然后
- 调用
NSRunningAppplication
的方法 activateWithOptions:
传递 NSApplicationActivateIgnoringOtherApps
以激活与 window 关联的应用程序。
不幸的是,我看到大苏尔下的行为发生了变化。具体来说,假设我打开了两个应用程序,每个应用程序都有两个 windows:
- AppX 有 windows:
- X1 覆盖我屏幕的左半部分
- X2 覆盖我屏幕的右半边
- AppY 有 windows:
- Y1 覆盖了我屏幕的左半部分
- Y2 覆盖我屏幕的右半部分
从 X1 和 X2 都可见(在顶部)开始:
- 在 Big Sur 之前我可以 select window Y2 这将使 AppY 当前应用程序并给我留下 windows X1 和 Y2 可见
- 自从升级到 Big Sur 当我 select window Y2, 调用
activateWithOptions:
将所有应用程序 AppY 的 windows 向前,仅显示 Y1 和 Y2.
同样的事情发生在相反的情况下(从 Y1 和 Y2 可见(在顶部)开始,然后尝试将 X1 向前看还是看到 Y2).
NSRunningApplication
的 activateWithOptions:
方法的文档说:
By default, activation brings only the main and key windows forward. If you specify NSApplicationActivateAllWindows, all of the application's windows are brought forward." My application is not specifying NSApplicationActivateAllWindows.
关于应用应该如何处理这个问题的任何建议? (如果您说“该应用程序已经在做正确的事情”,那完全没问题,但我很想知道是否有合理的解决方法。)
[旁白:我也欢迎任何关于让 Apple 注意到这一点的最佳方式的提示。]
我刚刚使用以下代码使我的应用再次正常运行。它使用已弃用的函数(从 10.9 开始),所以我不希望这些函数很快消失。不理想,但至少不会导致奇怪的用户体验。
- (OSStatus)makeApplicationFront:(NSRunningApplication*)application
{
if(!application || application.processIdentifier == -1) {
return procNotFound; // Previous front most application is nil or does not have a process identifier.
}
ProcessSerialNumber process;
OSStatus error = GetProcessForPID(application.processIdentifier, &process); // Deprecated, but replacement (NSRunningApplication:activateWithOptions:] does not work properly on Big Sur.
if(error) {
return error; // Process could not be obtained. Evaluate error (e.g. using osstatus.com) to understand why.
}
return SetFrontProcessWithOptions(&process, kSetFrontProcessFrontWindowOnly); // Deprecated, but replacement (NSRunningApplication:activateWithOptions:] does not work properly on Big Sur.
}
希望对你也有帮助。
我正在 MacOS Big Sur 上使用 select windows 的应用程序。 (我有轻微的手颤,导致我经常点击鼠标错过预期的目标。)
应用程序:
- 使用 AppKit“macOS 辅助功能”API 到 select windows。它调用
AXUIElementSetAttributeValue
函数来设置属性NSAccessibilityMainAttribute
以将特定的 window 放在前面 然后 - 调用
NSRunningAppplication
的方法activateWithOptions:
传递NSApplicationActivateIgnoringOtherApps
以激活与 window 关联的应用程序。
不幸的是,我看到大苏尔下的行为发生了变化。具体来说,假设我打开了两个应用程序,每个应用程序都有两个 windows:
- AppX 有 windows:
- X1 覆盖我屏幕的左半部分
- X2 覆盖我屏幕的右半边
- AppY 有 windows:
- Y1 覆盖了我屏幕的左半部分
- Y2 覆盖我屏幕的右半部分
从 X1 和 X2 都可见(在顶部)开始:
- 在 Big Sur 之前我可以 select window Y2 这将使 AppY 当前应用程序并给我留下 windows X1 和 Y2 可见
- 自从升级到 Big Sur 当我 select window Y2, 调用
activateWithOptions:
将所有应用程序 AppY 的 windows 向前,仅显示 Y1 和 Y2.
同样的事情发生在相反的情况下(从 Y1 和 Y2 可见(在顶部)开始,然后尝试将 X1 向前看还是看到 Y2).
NSRunningApplication
的 activateWithOptions:
方法的文档说:
By default, activation brings only the main and key windows forward. If you specify NSApplicationActivateAllWindows, all of the application's windows are brought forward." My application is not specifying NSApplicationActivateAllWindows.
关于应用应该如何处理这个问题的任何建议? (如果您说“该应用程序已经在做正确的事情”,那完全没问题,但我很想知道是否有合理的解决方法。)
[旁白:我也欢迎任何关于让 Apple 注意到这一点的最佳方式的提示。]
我刚刚使用以下代码使我的应用再次正常运行。它使用已弃用的函数(从 10.9 开始),所以我不希望这些函数很快消失。不理想,但至少不会导致奇怪的用户体验。
- (OSStatus)makeApplicationFront:(NSRunningApplication*)application
{
if(!application || application.processIdentifier == -1) {
return procNotFound; // Previous front most application is nil or does not have a process identifier.
}
ProcessSerialNumber process;
OSStatus error = GetProcessForPID(application.processIdentifier, &process); // Deprecated, but replacement (NSRunningApplication:activateWithOptions:] does not work properly on Big Sur.
if(error) {
return error; // Process could not be obtained. Evaluate error (e.g. using osstatus.com) to understand why.
}
return SetFrontProcessWithOptions(&process, kSetFrontProcessFrontWindowOnly); // Deprecated, but replacement (NSRunningApplication:activateWithOptions:] does not work properly on Big Sur.
}
希望对你也有帮助。