2013-09-23 1 views
2

나는 pykeylogger을 사용하고 있으며 현재 키보드 레이아웃에 대한 정보를 추가하여 약간 확장하려고합니다. (지금은 US qwerty이라고 가정하고 어떤 버튼을 눌렀는지 알 수 있습니다). Windows 시스템 그것이 들어Python의 * nix에서 키보드 레이아웃을 감지하십시오.

은 다음과 같습니다

def get_locale(self): 
     if os.name == 'nt': 
      w = user32.GetForegroundWindow() 
      tid = user32.GetWindowThreadProcessId(w, 0) 
      return hex(user32.GetKeyboardLayout(tid)) 

레이아웃의 16 진수 코드를 얻기 위해 (같은 0x409409) 나는 기본적으로 서로 하나의 레이아웃을 구별하기 원하는 나에게 좋은입니다.

당신이 나에게 POSIX (예를 들어 우분투) 시스템에 대한 해결책을 주시면 감사하겠습니다.

+0

시도해주세요./etc/default/keyboard/' – DanielB

+0

@DanielB 당신은/etc/default/keyboard에서 읽을 수 있으며 현재 응용 프로그램의 레이아웃에 초점을 맞출 수 있습니까? 나를 위해'sudo cat/etc/default/keyboard' 명령은 현재 레이아웃에 대해 동일한 내용을 반환합니다. – Meta

답변

1

나는 나를 위해 작동 다음 발견 :

  1. xkblayout-state를 컴파일
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를 다시 썼다

  • PATH에서 디렉토리에 실행 파일을 이동 지금 get_locale 반환 좋은 문자 코드를 Ubuntu에서 현재 로케일 (즉, 쿼티 (qwerty)에 대한 'us')의 수를 나타냅니다.

    예, 각 OS마다 출력이 다르므로 앞으로이 기능을 확실히 다시 작성하겠습니다. 그러나 지금은 윈도우와 유닉스 시스템에서 자판 배열을 탐지 할 수있는 목표를 달성했다.

    또 다른 옵션은 (자세한 내용은 this question 참조) xset -q | grep -A 0 'LED' | cut -c59-67 같은 xset 유틸리티를 사용하는 것입니다하지만 난 당신이 (내가처럼) 두 개 이상의 레이아웃이 특히 약간 비린내가 있다고 생각 - 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 + GBGR + (단순) 2 + INET (evdev) + (ctrl_alt_bksp)를 종료"등};

    +0

    예'setxkbmap -print'는 설치된 레이아웃 목록을 제공하지만 현재 활성화 된 레이아웃을 어떻게 찾을 수 있습니까? – Meta

    +0

    xkb-switch를 사용하면 지금 acts가 무엇인지 알고 싶을 것입니다. [link] (https://github.com/ierton/xkb-switch). 예 : xkb-switch -> gr (단순), xkb-switch -> gb –

    +0

    나는 이것을 조사 할 것이다. 고맙습니다! – Meta

    관련 문제