VB6应用程序在按下按键时崩溃

问题描述:

我有一个VB6应用程序,它具有通过其KeyPress事件处理输入的窗体。在该方法中,它会通过一系列if语句检查是否已传入ASCII代码,并运行必要的代码以响应输入。所以,基本的格式是:VB6应用程序在按下按键时崩溃

Private Sub Form_Keypress (KeyAscii As Integer) 

If KeyAscii = 97 
' Do some stuff 

If KeyAscii = 98 
' Do some different stuff 

End Sub 

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

我需要知道为什么应用程序似乎无法处理按键流以及如何避开它。

我重新编写代码的时候看上去就像这样:

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。如果您认为其他应该能够控制是否需要启用Keypress功能,则在模块级别使用Private变量。

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


编辑清理这件事与一些在意见的建议一致,并澄清程序流程。

+1

虽然我经常使用这种方法,但总是在Sub的第一行放置'If bInKeyPress = True Then Exit Sub',在错误处理程序之前,将'Static bInKeyPress as Boolean'放在Sub之外。这减少了退出前所需的指令,重要的是减少了可能是原始问题的调用堆栈大小。 – djv 2013-03-07 00:07:05

+0

@DanVerdolino同意,把它放在'On Error'语句之前是很有道理的。然而,将它放在程序本身之外,将使程序之外的方法可以访问,而这可能或可能不是所期望的。 – 2013-03-07 00:09:58

+0

@DavidTMacknet好点。那么他的回答很好。 – djv 2013-03-07 00:18:24