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 中定义名称 $.UCKeyTranslate
或 UCKeyTranslate
。
一种方法是制作一个 Swift 或 ObjC 帮助程序库(或命令行工具),然后从 JXA 使用它。 .
如果您将此调用包装在框架内的 ObjC 对象方法中,则可以 ObjC.import()
它并在您的脚本中使用。如果您选择执行命令行应用程序,则将其称为 shell 命令。
使用ObjC.bindFunction似乎有点太复杂了,因为你必须绑定一些其他的函数来获得一个 UCKeyboardLayout 实例,并定义一堆魔法常量,再加上一些必要的映射字符串和指针。
在 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 中定义名称 $.UCKeyTranslate
或 UCKeyTranslate
。
一种方法是制作一个 Swift 或 ObjC 帮助程序库(或命令行工具),然后从 JXA 使用它。
如果您将此调用包装在框架内的 ObjC 对象方法中,则可以 ObjC.import()
它并在您的脚本中使用。如果您选择执行命令行应用程序,则将其称为 shell 命令。
使用ObjC.bindFunction似乎有点太复杂了,因为你必须绑定一些其他的函数来获得一个 UCKeyboardLayout 实例,并定义一堆魔法常量,再加上一些必要的映射字符串和指针。