1

私は問題を抱えています。それは私の前にある他の多くの問題に似ていますが、それをより困難にする方法が異なります。:)

Linux コンソール用のテキスト エディターを作成しています。X11 は実行されていないため、そのためのツールキットは忘れてください。Shift キーを押しながら矢印キーを使用して (X ベースまたは Windows ベースのエディターで行うのと同じように) テキストのセクションをマークできるようにしたいので、キーダウン イベントとキーアップ イベントをキャプチャしたいと考えています。

raw モードを使用してキー スキャンコードにアクセスするアプリケーションを以前に作成できましたが、シフト キーと矢印キーを同時に検出することはできません。

任意のキーの組み合わせ (または、少なくとも Shift、Ctrl、Alt のすべての組み合わせ) を検出できるサンプル コードはありますか。

4

2 に答える 2

1

ncursesを使用するのはどうですか? また、接続している特定の端末タイプなどに合わせてテキストをフォーマットする方法を理解するのにも役立ちます。

Python バインディングが提供するgetkey()関数を使用して、さまざまなキーの修飾子を見つけることができます。KEY_SRまた、Shift + 矢印キーには、KEY_SF上下とKEY_SLEFTとで省略された別のキー コードがあることもわかりましたKEY_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)

あなたはそれで遊ぶかもしれません。getkey()のソースを見ると、基本的にgetchkeynamecurses 関数の組み合わせであることがわかります。

于 2012-07-22T13:43:48.267 に答える
0

やろうと思っていたことは、なんとかやり遂げました。唯一の問題は、キーボード ドライバーに直接接続する必要があることです。現在、ルート権限なしでそれを行う方法がわからないため、エディターにはルートが必要です。これは厄介かもしれません。

要するに、/dev/input/event? ストリーム、どこ?はキーボード ドライバーの番号 (ほとんどの場合 0) であり、そこからキーの押下をキャプチャします。イベントはすべてのアプリケーションから配信されるため (これは結局キーボード ドライバーです)、これはキーの状態を確認する場合にのみ役立ちます (ダウン プレス イベントとアップ プレス イベントからキーの状態を構築することによって)。

より一般的なソースから他のすべてのキー押下を取得し、CTRL、SHIFT などのキーボード ドライバーを使用することをお勧めします。

一緒に動作するようになったら、後でコードを投稿します。:)

于 2012-07-22T13:41:15.627 に答える