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))

基本的にレイアウトを別のレイアウトと区別したいので、レイアウトの16進コード(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"])

Ubuntu で現在get_localeのロケールのナイス レター コード (つまり、qwerty の場合は「us」) を返すようになりました。

はい、出力は OS ごとに異なります。この関数は、将来必ず書き直します。しかし今のところ、Windows と UNIX マシンでキーボード レイアウトを検出できるようにするという目標を達成しました。

別のオプションは、次xsetのようなユーティリティを使用することですxset -q | grep -A 0 'LED' | cut -c59-67(詳細については、この質問を参照してください)が、特に2つ以上のレイアウトがある場合(私のように)、少し怪しいと思います-スクロールLEDは、デフォルトレイアウトを除くすべてでオンになっています。

于 2013-09-24T02:59:22.323 に答える
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 { include "evdev+aliases( qwerty ) " };

xkb_symbols { include "pc+ gb + gr (シンプル):2+inet(evdev)+terminate(ctrl_alt_bksp)" };

于 2013-09-23T11:23:31.573 に答える