1

Perl/Tk では、次のようにイベントをバインドできます。

$mw->bind('<KeyPress-W>', sub{print "W is pressed";});

この情報を他の方向に取得することは可能ですか? 「キーの状態を取得する」「W が押されたかどうかを確認する」などの呼び出しを行うことはできますか?

イベントに直接反応することはありません。

もちろん、さまざまなイベントの変数を入力する可能性はありますが、そのような方法があるかどうか知りたいです。

4

1 に答える 1

3

Perl/Tk はそのような機能を提供しません。そのため、イベントを自分で追跡する必要があります。Any-KeyPressおよびイベントがあることに注意してください。そのAny-KeyReleaseため、すべてのキーに対してバインディングを作成する必要はありません。

$mw->bind("<Any-KeyPress>" => sub {
    warn $_[0]->XEvent->K; # prints keysym
});

X11 を使用している場合は、X11::Protocolモジュール (Perl/Tk スクリプト内で使用できます) を使用してQueryKeymapメソッドを呼び出すと、実際に押されたキーコードが得られます。これを示す小さなスクリプトを次に示します。

use strict;
use X11::Protocol;

# Get the keycode-to-keysym mapping. Being lazy, I just parse
# the output of xmodmap -pke. The "real" approach would be to
# use X11 functions like GetKeyboardMapping() and the
# X11::Keysyms module.
my %keycode_to_keysym;
{
    open my $fh, "-|", "xmodmap", "-pke" or die $!;
    while(<$fh>) {
        chomp;
        if (m{^keycode\s+(\d+)\s*=(?:\s*(\S+))?}) {
            if (defined $2) {
                $keycode_to_keysym{$1} = $2;
            }
        } else {
            warn "Cannot parse $_";
        }
    }
}

my $x11 = X11::Protocol->new;
while(1) {
    my $keyvec = $x11->QueryKeymap;
    for my $bit (0 .. 32*8-1) {
        if (vec $keyvec, $bit, 1) {
            warn "Active key: keycode $bit, keysym $keycode_to_keysym{$bit}\n";
        }
    }
    sleep 1;
}
于 2013-09-27T07:12:07.093 に答える