2013-09-23 50 views
2

我正在使用pykeylogger,並希望通過添加有關當前所選鍵盤佈局的信息(現在您從日誌中知道按下哪些按鈕時假設爲qwerty)來擴展它。在Python中檢測* nix中的鍵盤佈局

對於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)系統的解決方案,我將不勝感激。

+0

試試'/ etc/default/keyboard /' – DanielB

+0

@DanielB你的意思是說我可以從/ etc/default/keyboard中讀取,從而獲得當前應用程序焦點的佈局?對我來說''sudo cat/etc/default/keyboard'命令返回任何當前佈局的相同內容 – Meta

回答

1

我發現下面爲我的作品:

  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中的當前語言環境(即「我們」用於qwerty)。

是的,每個操作系統的輸出都不一樣,我將來肯定會重寫這個功能。但是現在我已經實現了我的目標,即能夠在windows和unix機器上檢測鍵盤佈局。

另一種選擇是使用xset實用像xset -q | grep -A 0 'LED' | cut -c59-67(見this question瞭解詳細信息),但我認爲這是有點腥,特別是如果你有兩個以上的佈局(像我一樣) - 滾動LED會亮以外的所有默認佈局。

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 {包括 「了evdev +別名(QWERTY)」};

xkb_symbols {包括 「PC + GB + GR (簡單):2 + INET(了evdev)+終止(ctrl_alt_bksp)」};

+0

yes'setxkbmap -print'給了我已安裝佈局的列表,但是如何檢測哪一個現在處於活動狀態? – Meta

+0

如果你想知道什麼是actice現在你可以使用xkb-switch。 [鏈接](https://github.com/ierton/xkb-switch)。例如: xkb-switch - > gr(簡單),xkb-switch - > gb –

+0

我會檢查一下。謝謝! – Meta