在Python的*nix操作系统中检测键盘布局

3
我正在使用pykeylogger,希望通过添加当前键盘布局的信息来对其进行扩展(目前你只能从日志中得知按下了哪些按钮,假定为美国的qwerty)。
对于Windows系统,它看起来像这样:
def get_locale(self):
        if os.name == 'nt':
            w = user32.GetForegroundWindow() 
            tid = user32.GetWindowThreadProcessId(w, 0) 
            return hex(user32.GetKeyboardLayout(tid))

我需要获取布局的十六进制代码(例如0x409409),这可以帮助我区分不同的布局。

如果您能给我提供基于posix系统(例如ubuntu)的解决方案,我将不胜感激。


Try /etc/default/keyboard/ - DanielB
@DanielB,您的意思是我可以从 /etc/default/keyboard 中读取并获取当前应用程序的布局吗?对于我来说,“sudo cat /etc/default/keyboard” 命令返回任何当前布局相同的内容。 - Meta
2个回答

2
我发现以下方法适用于我:
  1. 编译xkblayout-state并将可执行文件移动到PATH目录中
  2. get_locale重写为:
import os
if os.name == 'posix':    
    from subprocess import check_output
elif os.name == 'nt':
    import win32api, win32con, win32process
    from ctypes import windll
    user32 = windll.user32

def get_locale(self):
    if os.name == 'nt':
        w = user32.GetForegroundWindow() 
        tid = user32.GetWindowThreadProcessId(w, 0) 
        return hex(user32.GetKeyboardLayout(tid))
    elif os.name == 'posix':
        return check_output(["xkblayout-state", "print", "%s"])

现在,get_locale函数返回当前语言环境的字母代码(例如,在Ubuntu中为'us'表示QWERTY键盘布局)。

是的,每个操作系统的输出都不同,我将来肯定会重写这个函数。但是目前我已经实现了在Windows和Unix机器上检测键盘布局的目标。

另一个选择是使用xset实用程序,如xset -q | grep -A 0 'LED' | cut -c59-67(有关详细信息,请参见此问题),但我认为这有点可疑,特别是如果您有两种以上的布局(就像我一样)- 滚动LED对除默认布局以外的所有布局都是开启状态。


2

setxkbmap -print

xkb_keymap {
xkb_keycodes  { include "evdev+aliases(qwerty)" };
xkb_types     { include "complete"  };
xkb_compat    { include "complete"  };
xkb_symbols   { include "pc+gb+gr(simple):2+inet(evdev)+terminate(ctrl_alt_bksp)"   };
xkb_geometry  { include "pc(pc105)" };
};

xkb_keycodes { 包含 "evdev+aliases(qwerty)" };

xkb_symbols { 包含 "pc+gb+gr(simple):2+inet(evdev)+terminate(ctrl_alt_bksp)" }


是的,setxkbmap -print 命令可以列出已安装的键盘布局列表,但我该如何检测当前正在使用哪个布局呢? - Meta
如果您想知道当前正在使用的键盘布局,可以使用xkb-switch。链接。例如:xkb-switch --> gr(简单),xkb-switch --> gb。 - Foo Bar User
虽然不是用Python编写的,但你可以编写一个小脚本来下载它、解压缩、进入目录并构建它。然后你可以使用popen调用它。不确定这是否是最佳解决方案,但它可以工作。 - Foo Bar User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接