2012-04-30 87 views
1

我有一個小控制檯應用程序,其中包括檢查另一個操作的狀態。一秒鐘後,它使用Term :: ReadKey檢查按鍵。如果按下'r'鍵,則刷新顯示屏:如何確定F15是否被按下?

{ # generate display ... 
    print "Press 'r' to refresh, any other key to exit: "; 
    my $resp = readkey(); 
    print $resp; 
    redo if $resp =~ /r/i; 
} 
exit; 

sub readkey { 
    my $key; 
    ReadMode('cbreak'); 
    while (not defined $key) { 
     if (defined ($key = ReadKey(-1))) { 
      exit if $key =~ /\cC/i; # allow Ctrl-C to behave normally 
      return $key; 
     } else { 
      sleep 1; 
     } 
    } 
    ReadMode('normal'); 
}  

這一切完全按照預期工作。但是,我也使用Caffeine來保持我的Win 7顯示屏不進入睡眠狀態。該實用程序通過每59秒模擬一次F15的按鍵來工作,因此絕不允許屏幕保護程序啓動。雖然咖啡因的方法非常糟糕,但它對我來說多年來一直很好。但是,就像Windows一樣,我的控制檯應用程序也會將F15的模擬按鍵讀取爲真正的按鍵,導致控制檯應用程序退出。如果我能匹配F15,我可以將它濾掉。所以,我的問題:

如何確定F15是否被按下,使用Term :: ReadKey?

這是在Windows 7 Pro,草莓5.12.3,Term :: ReadKey v。2.30.02。我知道可能有一個重要的x-y problem組件對我的問題,我歡迎其他解決方案,但我很好奇如何做這件事,我可以看到爲什麼我可能想看看什麼時候功能鍵被按下的其他情形。)

回答

2

[這是很好的,你認識到這一點非常XY :)]

您使用的是UNIX的中心模塊。例如,使用更合適的模塊:Win32::Console

[我以前的答案已轉換爲評論。顯然,堆棧溢出MODS的希望我的回答是99%repeated content?!?]

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_F15 && ($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_F15 => 0x7E, 
}; 

use constant SHIFTED_MASK => 
    RIGHT_ALT_PRESSED | 
    LEFT_ALT_PRESSED | 
    RIGHT_CTRL_PRESSED | 
    LEFT_CTRL_PRESSED | 
    SHIFT_PRESSED; 
+0

感謝@ikegami,那將令人欽佩的服務。 [另外,感謝回答問題儘管其x-y性質:)] – Twixi