【问题标题】:NSRunningApplication activateWithOptions method behavior change with Big SurNSRunningApplication activateWithOptions 方法行为随着 Big Sur 的改变
【发布时间】:2020-12-08 09:40:41
【问题描述】:

我正在使用应用程序在 MacOS Big Sur 上选择窗口。 (我有轻微的手部颤抖,这导致我经常在点击鼠标时错过预期的目标。)

应用程序:

  • 使用 AppKit“macOS 的辅助功能”API 来选择窗口。它调用AXUIElementSetAttributeValue 函数来设置属性NSAccessibilityMainAttribute 将特定窗口置于前面然后
  • 调用NSRunningAppplication 的方法activateWithOptions: 传递NSApplicationActivateIgnoringOtherApps 以激活与该窗口关联的应用程序。

不幸的是,我看到 Big Sur 的行为发生了变化。具体来说,假设我打开了两个应用程序,每个应用程序都有两个窗口:

  • AppX 有窗口:
    • X1 覆盖了我的屏幕左半边
    • X2 覆盖了我屏幕的右半部分
  • AppY 有窗口:
    • Y1 覆盖了我屏幕的左半部分
    • Y2 覆盖了我屏幕的右半部分

从可见的 X1 和 X2 开始(在顶部):

  • Big Sur 之前我可以选择窗口 Y2,这将使 AppY 成为当前应用程序,并留下窗口 X1Y2可见
  • 自从升级到 Big Sur 当我选择窗口 Y2 时,对 activateWithOptions: 的调用将所有应用程序 AppY 的窗口向前移动,仅显示Y1Y2

在相反的情况下也会发生同样的事情(从 Y1Y2 可见(在顶部)开始,然后尝试将 X1 向前并且仍然看到Y2)。

NSRunningApplicationactivateWithOptions: 方法的文档说:

默认情况下,激活只会将主窗口和关键窗口向前移动。如果您指定 NSApplicationActivateAllWindows,则应用程序的所有窗口都会前移。”我的应用程序没有指定 NSApplicationActivateAllWindows。

关于应用应该如何处理这个问题有什么建议吗? (如果您说“该应用程序已经在做正确的事情”,那很好,但我很想知道是否有合理的解决方法。)

[顺便说一句:我也欢迎任何关于让 Apple 注意到这一点的最佳方式的提示。]

【问题讨论】:

  • 我遇到了同样的问题。看起来像是大苏尔的一个错误?

标签: macos appkit macos-big-sur


【解决方案1】:

我刚刚设法使用以下代码使我的应用程序再次正常工作。它使用不推荐使用的函数(从 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.
}

希望对你也有帮助。

【讨论】:

  • 谢谢你,@niels-mouthaan!这确实非常有用。我可能会尝试在一些类似的代码中存根以尝试恢复我的功能……同时等待 Apple 承认并纠正他们的问题。
  • 只是一个更新:我能够成功地将您建议的代码合并到我正在使用的应用程序中。在 Apple 真正修复他们破坏的 API 之前,我希望能够使用这个变通方法。
  • 很高兴听到这个消息,我同意,尽管我还没有收到关于我的错误报告的反馈。
猜你喜欢
  • 2015-10-28
  • 2021-03-08
  • 2020-10-20
  • 2021-09-12
  • 2021-05-09
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多