2012-07-20 89 views
1

我遇到了一個問題,這與我之前的很多其他問題類似,但以不同的方式使問題變得更加困難。 :)在linux控制檯捕獲關鍵事件

我正在爲Linux控制檯編寫一個文本編輯器。沒有X11運行,所以忘記任何工具包。我想要捕獲按鍵和按鍵事件,因爲我希望能夠通過按住Shift鍵並使用箭頭鍵(很像在基於X或Windows的編輯器中)來標記文本的各個部分。

我以前設法編寫了一個使用原始模式訪問鍵掃描碼的應用程序,但它無法同時處理檢測移位鍵和箭頭鍵。

有沒有人有一個示例代碼,能夠檢測到任何組合鍵(或至少所有與shift,ctrl和alt組合)。

回答

0

我有點想辦法做我想做的事情。唯一的問題是它需要我直接連接到鍵盤驅動程序。現在我不知道如何做到這一點,沒有root權限,所以我的編輯器需要root權限。這可能很尷尬。

總之,我打開/ dev/input/event?流,在哪裏?是鍵盤驅動程序的編號(通常爲0)並從那裏捕獲按鍵。由於事件是從所有應用程序傳遞的(這完全是鍵盤驅動程序),因此這對於檢查某個鍵的狀態(通過構建向下和向上按下事件中的鍵狀態)來說是非常有用的。

最好從一個更傳統的來源獲取所有其他按鍵,並使用CTRL,SHIFT等鍵盤驅動程序。

我以後會發布代碼,如果我得到它一起工作。 :)

0

如何使用ncurses,它爲你做了什麼?它還可以幫助您瞭解如何爲您連接的特定終端類型設置文本格式等。

使用python綁定提供的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也會有問題。這意味着我必須以其他方式檢測這些按鍵。 – 2012-07-23 06:17:18

+0

@TheScienceBoy我添加了一個例子和一些對我的回覆的引用。我現在看到你的問題在哪裏檢測到shift + up和shift + down。希望這可以幫助! – 2012-07-24 08:28:54

+0

我在我的系統上嘗試了你的解決方案,但是在X11中(爲了方便起見,我首先嚐試了)沒有檢測到shift + key和shift + key down(sleft and sright working)。在X11外部的適當控制檯中檢測到不換檔鍵。 據我瞭解,這種事情需要Linux中真正的低級別解決方案,這有點令人傷心。人們會認爲鍵盤處理會更容易。 – 2012-10-22 18:20:50