2012-04-16 2 views
1

Up -keyを押すと、このスクリプト(Term::TermKey)はYou pressed: <Up>を出力します。私はWin32::Consoleと同じ結果に達する可能性がどのようにWin32 :: Consoleで特殊キーを読み込むには?

#!/usr/bin/env perl 
use warnings; 
use 5.012; 
use Term::TermKey; 

my $tk = Term::TermKey->new(\*STDIN); 
say "Press any key"; 
$tk->waitkey(my $key); 
say "You pressed: <" . $tk->format_key($key, 0) . ">"; 


私はこれを試してみましたが、それはlkのような「ノーマル」キー、...ではなくUpDeleteのようなキーで、...

use Win32::Console; 

my $in = Win32::Console->new(STD_INPUT_HANDLE); 
$in->Mode(ENABLE_PROCESSED_INPUT); 
my $result = $in->InputChar(1); 
say "<$result>"; 

がどのように私はUpのようなワーク鍵を作ることができるだけに働いていました、Delete、... Win32::Console

+0

"アップ" は文字ではありません。あなたは 'Input'を使わなければならないと思います。 – ikegami

答えて

3

アップキーは文字になりません。 InputCharは返品できません。 Inputを使用する必要があります。

my $con_in = Win32::Console->new(STD_INPUT_HANDLE); 
for (;;) { 
    my @event = $con_in->Input(); 

    my $event_type = shift(@event); 
    next if !defined($event_type) || $event_type != 1; # 1: Keyboard 

    my ($key_down, $repeat_count, $vkcode, $vscode, $char, $ctrl_key_state) = @event; 
    if ($vkcode == VK_UP && ($ctrl_key_state & SHIFTED_MASK) == 0) { 
     if ($key_down) { 
     say "<Up> pressed/held down" for 1..$repeat_count; 
     } else { 
     say "<Up> released"; 
     } 
    } 
} 

キーボードイベントの詳細については、KEY_EVENT_RECORDを参照してください。

Virtual-Key Codesを参照してキーを識別してください。上記のコードのための


ヘッダおよび定義:

use strict; 
use warnings; 
use feature qw(say); 

use Win32::Console qw(STD_INPUT_HANDLE); 

use constant { 
    RIGHT_ALT_PRESSED => 0x0001, 
    LEFT_ALT_PRESSED => 0x0002, 
    RIGHT_CTRL_PRESSED => 0x0004, 
    LEFT_CTRL_PRESSED => 0x0008, 
    SHIFT_PRESSED  => 0x0010, 

    VK_UP => 0x26, 
}; 

use constant SHIFTED_MASK => 
    RIGHT_ALT_PRESSED | 
    LEFT_ALT_PRESSED | 
    RIGHT_CTRL_PRESSED | 
    LEFT_CTRL_PRESSED | 
    SHIFT_PRESSED; 
関連する問題