3

我正在使用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)系统的解决方案,我将不胜感激。

4

2 回答 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 都打开。

于 2013-09-24T02:59:22.323 回答
2

setxkbmap -打印

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)" };

于 2013-09-23T11:23:31.573 回答