2012-07-20 6 views
1

나는 전에 다른 많은 것들과 비슷한 문제가 있지만 훨씬 어렵게하는 방식으로 다르다. :)리눅스 콘솔에서 키 이벤트 캡처하기

저는 리눅스 콘솔 용 텍스트 편집기를 쓰고 있습니다. X11 실행이 없으므로이를위한 툴킷을 잊어 버리십시오. Shift 키를 누른 상태에서 화살표 키를 사용하여 텍스트 섹션을 표시하려면 키 기반 이벤트와 키 - 업 이벤트를 캡처하고 싶습니다 (X 기반 또는 Windows 기반 편집기에서와 매우 비슷 함).

이전에는 원시 모드를 사용하여 키 스캔 코드에 액세스하는 응용 프로그램을 작성했지만 Shift 키와 화살표 키를 동시에 감지 할 수 없습니다.

키 조합 (또는 적어도 shift, ctrl 및 alt과의 모든 조합)을 감지 할 수있는 예제 코드가있는 사람이 있습니까?

답변

0

나는 내가해야 할 일을 처리했습니다. 유일한 문제는 키보드 드라이버에 직접 연결해야한다는 것입니다. 지금은 루트 권한 없이는 어떻게 해야할지 모르겠다. 그래서 편집자는 root 권한이 필요하다. 이것은 어색 할 수 있습니다.

즉,/dev/input/event를 열어 볼까요? 스트림, 어디? 키보드 드라이버 번호 (대부분 0)이며 거기에서 키 누르기를 캡처합니다. 이 기능은 이벤트가 모든 응용 프로그램 (모든 키보드 드라이버 이후)에서 전달되므로 키 상태를 확인하는 데 유용합니다 (아래쪽 및 위쪽 누르기 이벤트에서 키 상태를 작성).

더 일반적인 소스에서 다른 모든 키 누름을 얻고 CTRL, SHIFT 등의 키보드 드라이버를 사용하는 것이 좋습니다.

나중에 함께 작동하도록 코드를 게시합니다. :)

0

ncurses을 사용하면 어떨까요? 또한 연결된 특정 터미널 유형의 텍스트 서식을 지정하는 방법을 이해하는 데 도움이됩니다.

파이썬 바인딩이 제공하는 getkey() 함수를 사용하면 다른 키에 대한 한정자를 찾을 수 있습니다. 또한 Shift + 화살표 키에는 KEY_SR으로 축약 된 별도의 키 코드가 있으며 위아래로는 KEY_SF이고 KEY_SLEFTKEY_SRIGHT이라는 문자가 있음을 알게되었습니다.

import curses 
import curses.textpad 
import curses.ascii 

def decodeSuffix(i): 
    return { 
     0b110: (True, True, False), 
     0b100: (True, False, True), 
     0b111: (False, True, True), 
     0b101: (False, True, False), 
     0b011: (False, False, True), 
    }[i] 

def test(stdscr): 
    while True: 
     k = stdscr.getkey() 
     if k == "\n": 
      return 
     elif k[0] == "k" and len(k) > 1: 
      i = int(k[-1]) 
      shift, ctrl, alt = decodeSuffix(i) 
      s = "" 
      if shift: 
       s += "shift " 
      if ctrl: 
       s += "ctrl " 
      if alt: 
       s += "alt " 
      s += k[1:-1] 
      stdscr.addstr("{0:40s} {1:08b}\n".format(s, i)) 
     else: 
      stdscr.addstr("{0}\n".format(k)) 
      pass 

curses.wrapper(test) 

당신은 그걸로 놀 수 있습니다. source of getkey()을 보면, 기본적으로 getchkeyname curses 함수의 조합이라는 것을 알 수 있습니다.

+0

나는 ncurses를 사용하고 있습니다. 어떤 이유로 "Shift + Up"과 "Shift + Down"을 감지 할 수 없으며 일부 키의 경우 Ctrl 키와 Alt 키와 마찬가지로 문제가 발생할 것이라고 예측합니다. 이것은 다른 방식으로 이러한 키 누름을 감지해야 함을 의미합니다. –

+0

@ TheScienceBoy 예제와 내 답변에 대한 몇 가지 참조를 추가했습니다. 이제 문제가 shift + up 및 shift + down을 감지하는 곳을 봅니다. 희망이 도움이! –

+0

내 시스템에서 솔루션을 사용해 보았지만 X11 (편의를 위해 먼저 시도한) Shift + 키 업과 Shift + 키 다운이 감지되지 않았습니다 (슬리 프와 솔직한 작업). X11 외부의 적절한 콘솔에서 no-shift-key가 감지되었습니다. 내가 아는 한 이런 종류의 일은 리눅스에서 정말 저수준의 솔루션이 필요하다. 슬픈 일이다. 키보드 취급이 더 쉬울 것이라고 생각합니다. –