将 NSString 转换为 AXUIElementPostKeyboardEvent 的 keyCode+修饰符

Posted

技术标签:

【中文标题】将 NSString 转换为 AXUIElementPostKeyboardEvent 的 keyCode+修饰符【英文标题】:Converting NSString to keyCode+modifiers for AXUIElementPostKeyboardEvent 【发布时间】:2011-02-09 01:47:15 【问题描述】:

编辑:事实证明,我在最初探索可访问性 API 时被误导了。在 AX 层次结构中找到安全文本字段后,我就可以轻松设置该值。不知道除此之外如何处理这个问题,但我想为未来的搜索者更新这个问题。

我正在编写一些代码,这些代码将使用辅助功能 API 将键盘事件发布到目标应用程序。到目前为止,我已经能够编写一个简单的应用程序,它允许我输入一个字符串值,然后将带有这些键代码的键盘事件发布到目标应用程序。实际上,字符串会从另一个位置读取。

我还没有弄清楚如何确定是否也应该发布以及哪些修改键也应该发布。例如,当我在我的测试应用程序中键入Hello, world! 时,输入将作为hello, world1 发送到另一个应用程序,因为我还没有包含用于创建大写H 和感叹号的修饰键。像éü 这样的多键字符使这变得更加复杂。例如,发送é 会发送一个没有重音的原始e

是否有一种我忽略的简单方法可以识别修饰符以与键码结合以创建特定的 NSString 或 unichar?如果没有,是否有人建议如何进行?到目前为止,我想出的最好方法是使用所有可能的修饰符组合调用UCKeyTranslate,直到找到与unichar匹配的一个我使用-[NSString characterAtIndex:]我不确定这是可扩展的还是可靠的,但是,给定如上所述,某些字符的多次击键特性。

提前致谢!

【问题讨论】:

【参考方案1】:

这可能无济于事。但以防万一:真的有必要发送键盘事件吗?因为如果你需要支持比如 Kotoeri,那将会变得非常困难。

重写 insertText: 和 doCommandBySelector: 并发送按键序列的结果而不是单个按键是一件简单的事情。

【讨论】:

不,我认为这不适用于我的情况,因为有时我需要在密码字段中输入文本,据我所知,代表密码字段的 AXUIElements 不允许您直接使用通常的可访问性值设置调用设置值。 (我希望他们做到了!) Ross 方法的另一个问题是最终我想从文件中读取字符串并将该值发送到其他应用程序。【参考方案2】:

我找到了一个可以使用trick 的示例,但它不完整:无论如何它都不是通用解决方案...如何处理多个键盘布局?

有一个 cgquartz 过时的函数可以这样做:CGPostKeyboardEvent(不确定是否可以只传递 char?)可能仍然可以使用(标记为未记录,但有一些副作用......)。

编辑:UCKeyTranslate 作为一种构建字典的方式。有趣但操作系统如何做到这一点?更好的答案应该隐藏在某个地方!

【讨论】:

以上是关于将 NSString 转换为 AXUIElementPostKeyboardEvent 的 keyCode+修饰符的主要内容,如果未能解决你的问题,请参考以下文章

将 'NSString *' 转换为 'CTStringRef *' 的不兼容类型

如何将 NSUInteger 转换为 NSString?

无法将 NSString 转换为 NSURL

如果将一个NSObject从NSDictionary转换为NSString?

将 NSData 转换为 NSString 并再次转换为 NSData?

如何将 std::string 转换为 NSString?