我的循环/计时器出了什么问题?

时间:2013-11-26 17:26:45

标签: vb.net

此程序旨在收听预先确定的按键,一旦按下它不再侦听并从预先确定的数字开始倒计时,最后它会播放声音,然后再次开始收听。

我遇到的问题是,如果预先确定的键是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

结束班

1 个答案:

答案 0 :(得分:0)

我很确定您想要做的是而不是试图关闭GetAsyncKeyState,而只是在Tick事件结束时调用它 - 处理程序并丢弃结果。这样,在此期间按下的任何内容都无法通过稍后调用GetAsyncKeyState来获取,包括下次调用事件处理程序时。

Dim dummy As Integer
dummy = GetAsyncKeyState(keyCodeKeyboard1)
' Do nothing. Just ignore the results...