按下键时VB6应用程序崩溃

按下键时VB6应用程序崩溃,vb6,crash,keypress,crash-dumps,Vb6,Crash,Keypress,Crash Dumps,我有一个VB6应用程序,它的窗体通过按键事件处理输入。在该方法中,它检查通过一系列if语句传入的ASCII代码,并运行必要的代码来响应输入。因此,基本格式是: Private Sub Form_Keypress (KeyAscii As Integer) If KeyAscii = 97 ' Do some stuff If KeyAscii = 98 ' Do some different stuff End Sub 有24个键连接到一个键盘编码器,该编码器从信息亭前面的按钮提供输入。

我有一个VB6应用程序,它的窗体通过按键事件处理输入。在该方法中,它检查通过一系列if语句传入的ASCII代码,并运行必要的代码来响应输入。因此,基本格式是:

Private Sub Form_Keypress (KeyAscii As Integer)

If KeyAscii = 97
' Do some stuff

If KeyAscii = 98
' Do some different stuff

End Sub
有24个键连接到一个键盘编码器,该编码器从信息亭前面的按钮提供输入。操作系统是Windows7。我遇到的问题是,如果我按住其中一个键大约10秒钟,应用程序就会崩溃——没有例外,只是停止执行。我确实收集了一些小垃圾,我没有看到任何能给我提供任何有用信息的东西,但我没有阅读它们的经验


我需要知道为什么该应用程序似乎无法处理一连串的按键操作,以及如何绕过它。

我将重新编写它,使其看起来更像这样:

Private Sub Form_Keypress (KeyAscii As Integer)
    Static bInKeyPress As Boolean
    If bInKeyPress = True Then Exit Sub

    On Error GoTo Handler

    bInKeyPress = True

    If KeyAscii = 97
        ' Do some stuff

    ElseIf KeyAscii = 98
        ' Do some different stuff

' Everything goes through here, after execution is complete.
' Handler also calls through to this, to make sure we clean up things
ExitPoint:
    bInKeyPress = False
    Exit Sub

'Do any error handling / logging you want, here, then clean things up.
Handler:
    GoTo ExitPoint
End Sub
如果您不希望其他任何东西能够重置变量,请在子对象本身内部使用静态变量,并且只有在处理完成后,它才会切换回False。如果您认为其他东西应该能够控制是否需要启用按键功能,请在模块级别使用专用变量

基本上,你想在处理任何事情时停止听按键


编辑:对其进行了清理,以与评论中的一些建议保持一致,并澄清程序流程。

我将对其重新编码,使其看起来更像这样:

Private Sub Form_Keypress (KeyAscii As Integer)
    Static bInKeyPress As Boolean
    If bInKeyPress = True Then Exit Sub

    On Error GoTo Handler

    bInKeyPress = True

    If KeyAscii = 97
        ' Do some stuff

    ElseIf KeyAscii = 98
        ' Do some different stuff

' Everything goes through here, after execution is complete.
' Handler also calls through to this, to make sure we clean up things
ExitPoint:
    bInKeyPress = False
    Exit Sub

'Do any error handling / logging you want, here, then clean things up.
Handler:
    GoTo ExitPoint
End Sub
如果您不希望其他任何东西能够重置变量,请在子对象本身内部使用静态变量,并且只有在处理完成后,它才会切换回False。如果您认为其他东西应该能够控制是否需要启用按键功能,请在模块级别使用专用变量

基本上,你想在处理任何事情时停止听按键


编辑:将其清理干净,以便与注释中的一些建议保持一致,并澄清程序流程。

+1尽管我经常使用此方法,但始终将如果bInKeyPress=True,则在错误处理程序之前,在子程序的第一行退出子程序,并将静态bInKeyPress作为布尔值放在Sub之外。这减少了退出之前所需的指令,重要的是减少了调用堆栈的大小,这可能是最初的问题。@DanVerdolino同意,将其放在on Error语句之前是很有意义的。但是,将它放在过程本身之外,将使过程之外的方法可以访问它,这可能是可取的,也可能是不可取的。在VB6中,在您执行一些不同的操作之后,将通过处理程序继续执行。让我重新表述:处理程序:只是代码中某个位置的标签。它只被称为错误处理程序,因为我们用On error GoTo handler指向它。它与Try…Catch块非常不同。@DanVerdolino我对答案做了一些调整,将If-bInKeyPress语句移到On-Error-Goto语句之前,并将处理程序部分与ExitPoint分开进行清理。我认为这是一个更好的例子。+1虽然我经常使用这个方法,但总是把如果bInKeyPress=True,那么在Sub的第一行退出Sub,在错误处理程序之前,并把静态bInKeyPress作为布尔值放在Sub之外。这减少了退出之前需要的指令,重要的是减少了调用堆栈的大小,这很可能是最初的问题。@DanVerdolino同意,把它放在On Error语句之前是很有意义的。但是,将它放在过程本身之外,将使过程之外的方法可以访问它,这可能是可取的,也可能是不可取的。在VB6中,在您执行一些不同的操作之后,将通过处理程序继续执行。让我重新表述:处理程序:只是代码中某个位置的标签。它只被称为错误处理程序,因为我们用On error GoTo handler指向它。它与Try…Catch块非常不同。@DanVerdolino我对答案做了一些调整,将If-bInKeyPress语句移到On-Error-Goto语句之前,并将处理程序部分与ExitPoint分开进行清理。我认为这是一个更好的例子。