在Python中检测* nix中的键盘布局

时间:2013-09-23 08:18:56

标签: python ubuntu posix keyboard-events

我正在使用pykeylogger并希望通过添加有关所选当前键盘布局的信息来扩展它(现在您从日志中知道假设US 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)系统的解决方案,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

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 {include“evdev + aliases( qwerty )”};

xkb_symbols {include“pc + gb + gr (简单):2 + inet(evdev)+ terminate(ctrl_alt_bksp)“};

答案 1 :(得分:1)

我发现以下内容对我有用:

  1. 编译xkblayout-state并将可执行文件移至PATH目录
  2. 重写get_locale
  3. 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中返回当前语言环境的优秀字母代码(即qwerty的'us')。

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

    另一种选择是使用xset实用程序,例如xset -q | grep -A 0 'LED' | cut -c59-67(详见this question),但我认为这有点可疑,特别是如果你有两个以上的布局(就像我做的那样) ) - 除默认布局外,滚动LED均亮起。