2

给定一个字符串,我希望能够发送一组击键来键入该字符串,并且我希望能够在 OSX 上的 python 中完成它(在 python 中,因为它是已经用 python 编写的更大项目的一部分,在 OSX 上,因为我正在尝试将其移植到 OSX)。

我现在可以像这样使用 pyobj 来做到这一点(这有点简化):

from Quartz import *

CHAR_TO_SEQUENCE = {
    'a':[(0, True), (0, False)]
}

def send_string(string):
    for c in string:
        sequence = CHAR_TO_SEQUENCE[c]
        for keycode, key_down in sequence:
            CGEventPost(kCGSessionEventTap, CGEventCreateKeyboardEvent(None, keycode, key_down))

我已经充实了 CHAR_TO_SEQUENCE 以包含我可以在键盘上输入的大部分内容,这需要一段时间并且很乏味。

这样做的问题是:
- 它仅在键盘具有 ANSII 标准布局时才有效。例如,如果有人使用法语键盘,它会输入错误的内容。
- 它需要这张可笑的桌子。

我为 OSX 找到了这个通用解决方案,但不知道如何将其应用于 python: 如何将 ASCII 字符转换为 CGKeyCode?

那里提到的 API 似乎无法通过 pyobj 获得(或者我只是无法弄清楚导入路径)。

我已经看到一些建议将 CGEventKeyboardSetUnicodeString 设置为所需的字符串,而不必担心键码。但是我无法弄清楚如何从 python 调用 CGEventKeyboardSetUnicodeString (我无法正确获取参数)并且不清楚这是否会起作用,因为文档说应用程序可以选择忽略它以支持键码。

有没有办法在 OSX 上的 python 中做到这一点?

4

1 回答 1

1

看起来 Carbon 模块没有包装 TIS* 函数,其他任何东西也没有。

您可以扩展 PyObjC,但是构建一个简单的扩展模块来包装您实际需要的两个函数要简单得多。

由于这样做比解释如何做要快,因此您可以从https://github.com/abarnert/pykeycode获取它,然后执行通常的“python setup.py build_ext --inplace”或“sudo python setup.py install",然后查看 test.py 以了解如何使用它。

于 2012-06-01T23:30:14.993 回答