Python pynput 不是 'understanding' 希腊字符

Python pynput not 'understanding' greek characters

早上好, 我正在使用 Python 的 3.8 pynput(在 windows 10 中)获取每次输入字符(在系统级别),然后获取该字符的 unicode。

from pynput import keyboard


def on_press(key):
    if key == keyboard.Key.esc: #if button escape is pressed close the program
        listener.stop()
    else: #if button escape is not pressed get the unicode code of the button-char pressed
        unicode_code = ord(getattr(key, 'char', '0'))
        print("The unicode is ",unicode_code)
        print("The char entered is",chr(unicode_code))


controller = keyboard.Controller()
# Collect events until released
with keyboard.Listener(on_press=on_press) as listener:
    listener.join()

我面临的问题是,当我将键盘更改为希腊语(使用 shift+alt)时,它保留了英语的 unicode 而不是希腊语。 您可以查看随附的屏幕截图以更好地理解。

如何克服这个问题?

不,您没有获得英文 unicode 代码。您正在获得由键盘编辑的代码 return 的 unicode 表示。无论选择什么语言,它们都是相同的,因为键盘层设计为始终 return 相同键的相同代码(根据它们的位置 and/or 在 querty/quertz 或其他 HID 兼容键盘上的含义)如果可能的话。您在代码中所做的实际上是恢复 pynput 完成的过程,该过程使用 char()/unichar() 函数转换键盘代码。想一想:是否有希腊语表示,例如F11 键?

我不记得 pynput 是否有更高级别的输入支持,尽管我认为有。并且应该可以直接得到你想要的 您要做的是找到另一个包含发送到输入字段的字符的属性(如果有的话,我不是 pynput 专家),或者检查当前的键盘语言并适当地映射代码 returned。您还可以尝试使用 codecs 模块来处理代码页。最坏的情况包括直接从 GUI 的输入字段中获取字符。但那将是非常不优雅的,bruteforc-ish,如果不是绝对必要的话,根本不应该这样做。还有其他方法可以从 OS 获取输入——比如通过 ctypes、wintypes、Mac 上的 Cocoa/Carbon 或 Mac 上的 GTK 使用内置库直接链接到其事件输入系统或内核=17=].

尝试使用 pynput 版本 1.1.7,它在那里工作。它在 1.4 之后被破坏,在这两者之间它可以工作,但是在程序 运行 时使用 windows 快捷方式更改布局,70% 的时间都不起作用,这意味着 Windows 只是不改变语言。或者,您可以通过尝试 this 解决方案在较新的版本中解决它,如果您不关心性能,该解决方案会实时转换字符。我已经在回购的 github.

中打开了一个问题来修复它