此程序旨在收听预先确定的按键,一旦按下它不再侦听并从预先确定的数字开始倒计时,最后它会播放声音,然后再次开始收听。
我遇到的问题是,如果预先确定的键是E,如果我在倒计时期间按两次E,它将经过两次循环并在每次倒计时后播放两次声音。
我希望程序只在开始时和声音后听一个键,而不是在中间。
这是代码:
Private Sub DotTimer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DotTimer1.Tick
Dim lngLoopCntr1 As Integer
Dim lngMilliSecs1 As Integer
If (GetAsyncKeyState(keyCodeKeyboard1)) And loopD1 = 0 And Not My.Computer.Keyboard.ShiftKeyDown Or (GetAsyncKeyState(keyCodeKeyboard1)) And loopD1 = 0 And My.Computer.Keyboard.ShiftKeyDown And ShiftTime.SelectedItem = "Yes" Then 'keyCodeKeyboard1 is a text input from form
loopD1 = 1
DotTimer1.Stop() 'stop's getasynckeystate from polling whilst loop process
lngLoopCntr1 = 0
lngMilliSecs1 = 1000 * dotTimeNum1 - 10
Do While True 'loop countdown
Sleep(10)
lngLoopCntr1 = lngLoopCntr1 + 10
If lngLoopCntr1 > lngMilliSecs1 Then Exit Do
Loop
If lngLoopCntr1 > lngMilliSecs1 And loopD1 = 1 Then 'plays tone once countdown finished
My.Computer.Audio.PlaySystemSound( _
System.Media.SystemSounds.Beep)
End If
End If
loopD1 = 0
DotTimer1.Start() 'restarts timer
End Sub
结束班
答案 0 :(得分:0)
我很确定您想要做的是而不是试图关闭GetAsyncKeyState
,而只是在Tick
事件结束时调用它 - 处理程序并丢弃结果。这样,在此期间按下的任何内容都无法通过稍后调用GetAsyncKeyState
来获取,包括下次调用事件处理程序时。
Dim dummy As Integer
dummy = GetAsyncKeyState(keyCodeKeyboard1)
' Do nothing. Just ignore the results...