2017-10-11 27 views
0

Python 2.7で小さなルーチンを書きましたが、これはしばらくの間(たとえば10分)待っていますが、ユーザーがキーを押すとすぐに終了します。Python 2.7 - SHIFT-KEYまたはCTRL +キーが押されているかどうかを確認する方法は?

私は、Windows(7、64ビット)にので、私はMSVCRTライブラリを使用してみました:

import sys 
import msvcrt 
from time import sleep 

    def sleep_sec(secstosleep, allowskip = True): 
     waitinterval_ms = 0.050 
     nwaits = int(secstosleep * 1000/waitinterval) 

     sys.stdout.write("\n Sleeping for %s seconds. You can press CTRL-F12 to skip.\n\n" % secstosleep) 
     for sl in range(0, nwaits + 1): 
      sleep(waitinterval_ms) 
      if allowskip: 
       # Check if User has pressed CTRL-F12 to stop waiting 
       if = msvcrt.kbhit(): 
        kp = msvcrt.getch() 
        if kp == '\xe0': 
         print "\a" # Beep once 
         sys.stdout.write("\nSleep interrupted by User\n") 
         break 

効果で、それはユーザーならば、それが壊れるという事実を除いて、非常によく動作しますF12、F11またはCursor Upキーを押すと:F12キーを押すとgetch()が '\ xe0'を返しますが、同じコードが他のキーでも返されているようです。 CTRL、SHIFT、ALTなどをトラップする方法はありません。

私は強制的にCTRL-F12を押して、間違ってそれらのキーの1つを押して待機をやめないようにしたいと思います。

何か間違っていますか? CTRL、ALT、またはSHIFTを他のキーと一緒に押すのを傍受する方法はありますか?

事前のおかげで、 マックス - msvcrt.getch()ためmsvcrtマニュアルからイタリア

答えて

1

[..]押されたキーは、特別なファンクションキーだった場合、これは '\ 000' を返しますがまたは '\ xe0';次の呼び出しでキーコードが返されます。

ただ、ダニエルによって示唆されるように、実際のキーコード

+0

ありがとう、ダニエル、今は完璧に動作します。マックス –

0

を取得するために、もう一度getch()を呼び出して、私はこのような私のコードを変更した:

import sys 
import msvcrt 
from time import sleep 

def sleep_sec(secstosleep, allowskip = True): 
    waitinterval_ms = 0.050 
    nwaits = int(secstosleep * 1000/waitinterval) 

    sys.stdout.write("\n Sleeping for %s seconds. You can press CTRL-F12 to skip.\n\n" % secstosleep) 
    for sl in range(0, nwaits + 1): 
     sleep(waitinterval_ms) 
     if allowskip: 
      # Check if User has pressed CTRL-F12 to stop waiting 
      if = msvcrt.kbhit(): 
       kp = msvcrt.getch() 
       if kp == '\xe0': 
        kp += msvcrt.getch() 

       if kp == '\xe0\x8a': # \x8a is the keycode for CTRL-F12 
        print "\a" # Beep once 
        sys.stdout.write("\nSleep interrupted by User\n") 
        break 

私は別のキーコードが返されることも気づきましたF12、CTRL-F12、SHIFT-F12ではキーストロークを簡単に認識できます。

もう一度、Daniel!

関連する問題