使用更新版本的 Java 我的一些应用程序快捷方式被 MacOS 快捷方式覆盖

With newer version of Java some of my applications shortcuts are being overridden by MacOS shortcuts

我的应用程序使用 Java 8,在 MacOS 上许多操作都定义了可以正常工作的快捷方式,例如这个定义为使用 COMMAND-1

public final class AutoCorrectAction
    extends CorrecterAction
{
    private static final String ACTION_NAME = "autocorrect";
    

    public AutoCorrectAction(final int paneIndex)
    {
        super(ACTION_NAME, TextLabel.MENU_AUTOCORRECT.getMsg(), paneIndex);
        if (paneIndex == TagDisplayer.INDEX_NONE)
        {
            putValue(ACCELERATOR_KEY,(KeyStroke.getKeyStroke(KeyEvent.VK_1,
                                          Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())));

        }
     
        this.putValue(Action.SMALL_ICON, JaikozIcon.LOCAL_AUTOCORRECT.getIconSmall());
        this.putValue(JaikozAction.LARGE_ICON, JaikozIcon.LOCAL_AUTOCORRECT.getIconLarge());
        this.putValue(Action.SHORT_DESCRIPTION,TextLabel.MENU_AUTOCORRECTTOOLTIP.getMsg());

    }

    public final void actionPerformed(final ActionEvent e)
    {
        start.logger.entering(this.getClass().getName(), JaikozLogFormatter.ACTION_PERFORMED);      
        this.performTask(new AutoCorrecter(start, isSelectedOnly(e), isUseRowSelection));
        start.logger.exiting(this.getClass().getName(), JaikozLogFormatter.ACTION_PERFORMED);
    }
}

我最新版本的软件现在使用 Java 11,现在当我按下 COMMAND-1 时它最小化 windows 并在 Finder 中显示,google 搜索确定这是标准 mac 快捷方式 - https://support.apple.com/en-us/HT201236

Command-1: View the items in the Finder window as icons.

所以我的问题是什么是正确的 mac 行为,我的应用程序中的快捷方式是否应该覆盖 MacOS 快捷方式,即这是 Java 中引入的错误11 或者是以前的行为错误,现在已修复。

令人困惑的是,我还有另一个使用 Command-2 的相同方式定义的操作,这也是一个标准的 MacOS 快捷方式

Command-2: View the items in a Finder window as a list.

public final class CreateAcousticIdAction
    extends CorrecterAction
{
    private static final String ACTION_NAME = "createmusicipacousticid";


    public CreateAcousticIdAction(final int paneIndex)
    {
        super(CreateAcousticIdAction.ACTION_NAME, TextLabel.MENU_CREATE_MUSICIP_ACOUSTIC_ID.getMsg(), paneIndex);
        this.putValue(Action.SMALL_ICON, JaikozIcon.CREATE_MUSICIP_PUID.getIconSmall());
        this.putValue(JaikozAction.LARGE_ICON, JaikozIcon.CREATE_MUSICIP_PUID.getIconLarge());

        this.putValue(Action.SHORT_DESCRIPTION, TextLabel.MENU_CREATE_MUSICIP_ACOUSTIC_IDTOOLTIP.getMsg());
        putValue(ACCELERATOR_KEY,(KeyStroke.getKeyStroke(KeyEvent.VK_2,
                                          Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())));
    }

    public final void actionPerformed(final ActionEvent e)
    {
        this.performTask(new CreateAcoustId(start,  isSelectedOnly(e), isUseRowSelection), JaikozThreadGroup.THREAD_CREATE_ACOUSTICID);
    }
}

但我的快捷方式继续工作,并且没有被 MacOS 快捷方式覆盖!

更新 我已经按照要求制作了电影 - http://www.jthink.net/jaikoz/scratch/cmd1issue.mov

我现在注意到的是,当我按下 Cmd-1 时,它会最小化 window,但它的 运行 也会自动更正,所以它会同时完成这两项操作。

So my question is what is the correct mac behaviour, should my shortcut in my application override the MacOS shortcut or not, i.e is this a bug introduced in Java 11 or was the previous behaviour buggy and now fixed.

并不是说它有帮助,但是...我认为这个问题本身是有缺陷的,至少对于这个问题。

您的 google 搜索是正确的,Finder 中的 command-1 将 window 的内容列为图标。但是 Finder 中的关键是 。该行为不会影响其他应用程序;它特定于 Finder。换句话说,它是 Finder 快捷方式,而不是 macOS 快捷方式。

一些系统范围的(“macOS”)快捷方式,比如捕捉屏幕图像(command-shift-3 等) , 或调出聚光灯 (command-space)。但是 command-1 不是其中之一,command-2 也不是。

所以你最初的问题,即哪个快捷方式(app 或 OS)应该覆盖另一个,对于 command-1 和 command-2 没有实际意义。

快速搜索没有显示 Mac-特定于 JDK11 LTR 的发行说明,但我怀疑这个问题确实是 JDK9、10 或 11 中某些更改的一部分。我不知道如何工作围绕这一点,但如果您有 Mac 特定的发行说明,它们可能会提供提示。

一般性地回答原始问题——与这个特定问题无关——如果没记错的话,macOS 快捷方式优先……但也有解决方法。 Apple > System Preferences... > Keyboard > Shortcuts 允许您更改现有的系统范围的快捷方式(尽管通常我会建议不要这样做),或者 - 更好的是 - 添加一个你认为应用 应该 有。

最后一个问题是 (1) 它必须是一个可执行的应用程序(所以不是 .jar),并且 (2) 它必须是一个标准的 GUI 应用程序,其中所需的操作作为菜单项存在,不是 UNIX CLI 可执行文件。

免责声明:我没有太多使用 MacOS 或从 java 创建 OS macros 与非第三方应用交互的经验(通常违背了 java 的目标,即独立于平台)。

答案:macro 层次结构通常由 OS 确定并受 java compiler/jvm 实现的影响。理想情况下,第三方和可能不受信任的 java 程序(通常是开发人员的情况)应该最后优先接收密钥 macro 因此任何使用 macros 的程序都应该避免任何可能预先存在的 macros 或确保它们比 OS/other 程序更受关注,以确保它们在它们之前收到所有输入。

理论实现:我能想到的实现这一点的两种主要方法是创建一个配置 file/program 以允许用户定义访问程序的键-macro(这使得无论 OS) 总是可以避免冲突,或者唤醒 macro 不太可能被其他程序唤醒(mac 等同于 ctr-shift-k),这会导致一个程序来获得对 OS 的关注,然后该程序可以根据需要调用任意多个键 macros。

注意:关于它发生的原因,我猜想 java 代码以前需要对 运行 的额外权限(这使得如果发现漏洞利用会更加危险)因此作为副作用它OS 在其他方面也给予了更高的优先级。因此,当特权级别在固定后下降时(java 11 中的所有其他安全功能),它在 key-macro 层次结构中的位置也会下降。

发现了问题,我没有意识到我也在应用程序中使用 Command-1 来最大化 windows,删除这个快捷方式解决了问题