JavaScript 中的 ObjC 函数 UCKeyTranslate 可以用于自动化吗?

Can the ObjC function UCKeyTranslate be used from JavaScript for Automation?

在 osascript/JXA 上下文中,我需要将 macOS 键码和修饰符映射到 Unicode 字符串(对于任何键盘布局,在 运行 时指定)

明显的候选者似乎是 UCKeyTranslate,但我试图从 JavaScript 自动化上下文中获取对它的引用到目前为止还没有成功。

有谁知道如何做到这一点,也许在 ObjC.bindFunction 方面?


当 ObjC 库被导入 'JavaScript for Automation'(或 'JXA')JSContext 时,全局 $ 符号用它们的方法修饰。

因此,例如,在 vanilla JXA 上下文中评估 $.NSPasteboard 评估为未定义,但在 ObjC.import('Appkit') 之后,我们可以编写并成功评估表达式,如:

ObjC.deepUnwrap(
    $.NSPasteboard
    .generalPasteboard
    .propertyListForType(clipType)
);

然而,在这种情况下,$.UCKeyTranslate 在以下之后的 JSContext 中仍未定义:

ObjC.import("CoreServices")
ObjC.import("CarbonCore")

在这种情况下,我们有时可以使用 ObjC.bindFunction 将 ObjC 函数的名称绑定到 JSContext 名称,例如,虽然这会是多余的,但我们可以成功地编写和使用名称函数名称 'sin' 和 'cos' 写完后。

['sin', 'cos'].forEach(
    k => ObjC.bindFunction(k, ['double', ['double']]));

但是,在这种情况下,ObjC.import 和 ObjC.bindFunction 路由到目前为止都没有在 JXA JSContext 中定义名称 $.UCKeyTranslateUCKeyTranslate

一种方法是制作一个 Swift 或 ObjC 帮助程序库(或命令行工具),然后从 JXA 使用它。 .

如果您将此调用包装在框架内的 ObjC 对象方法中,则可以 ObjC.import() 它并在您的脚本中使用。如果您选择执行命令行应用程序,则将其称为 shell 命令。

使用ObjC.bindFunction似乎有点太复杂了,因为你必须绑定一些其他的函数来获得一个 UCKeyboardLayout 实例,并定义一堆魔法常量,再加上一些必要的映射字符串和指针。