如何以编程方式在“系统偏好设置”中设置macOS键盘快捷键?

时间:2017-08-09 22:24:34

标签: c++ macos keyboard fltk

在macOS上,使用英文键盘时,组合键CMD+Backtick用于循环浏览应用程序的打开窗口。例如,在德语键盘上,组合为CMD+<。甚至可以使用System Preferences - &gt;配置此快捷方式Keyboard - &gt; Shortcuts - &gt; Keyboard - &gt; Move focus to next window

对于使用FLTK的多窗口GUI应用程序,我想利用这个快捷方式,但不知道如何获取用户在他或她的系统上设置的组合。所以我正在寻找的是一个macOS系统调用,它为我提供了在这台Mac上用于Move focus to next window的组合键。

当然,如果使用FLTK会有一些内置方式,我宁愿不得不使用本机系统调用。

谷歌搜索这个问题是一场噩梦...

更新08/10/2017 Öö的answer给了我一些关于其他研究的想法。我已经了解到偏好存储在com.apple.symbolichotkeys中,更准确地说是存储在密钥27中。

        27 =         {
        enabled = 1;
        value =             {
            parameters =                 (
                98,
                11,
                524288
            );
            type = standard;
        };
    };

参数1(98):这是“b”的ASCII码。第一个参数包含所用快捷方式的ascii代码,如果它是非ascii字符,则为65535。

参数2(11):这是kVK_ANSI_B(source)的键盘代码。这些代码取决于键盘。在美国键盘上,kVK_ANSI_Z为0x06,而在德国键盘上则为0x10。

参数3(524288):这是修饰键:

0x000000 => "No modifier",
0x020000 => "Shift",
0x040000 => "Control",
0x080000 => "Option",
0x100000 => "Command",

(0x80000等于524288。)

所以我的任务似乎是解析defaults read com.apple.symbolichotkeys的输出,从参数字典中获取组合键,根据键盘布局正确解释这些组合,并使用这些信息在我的FLTK中设置回调应用

1 个答案:

答案 0 :(得分:1)

我现在无法测试答案......但我会首先尝试popen defaults命令:

HFILE file;
if (!(file = popen("defaults read NSGlobalDomain NSUserKeyEquivalents", "r")))
{
    return nullptr;    
}
const int MAX_BUF_SIZE = 512;
char temp[MAX_BUF_SIZE+1] = "";
while (fgets(temp, MAX_BUF_SIZE, file) > 0)
{
    printf("%s",temp);
    memset(temp, 0, MAX_BUF_SIZE+1);
}
pclose(file);

这里我只是printf它的输出,但您可能想要解析它。