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变量。
基本上,你想在处理任何事情时停止听按键。
编辑:清理这件事与一些在意见的建议一致,并澄清程序流程。
虽然我经常使用这种方法,但总是在Sub的第一行放置'If bInKeyPress = True Then Exit Sub',在错误处理程序之前,将'Static bInKeyPress as Boolean'放在Sub之外。这减少了退出前所需的指令,重要的是减少了可能是原始问题的调用堆栈大小。 – djv 2013-03-07 00:07:05
@DanVerdolino同意,把它放在'On Error'语句之前是很有道理的。然而,将它放在程序本身之外,将使程序之外的方法可以访问,而这可能或可能不是所期望的。 – 2013-03-07 00:09:58
@DavidTMacknet好点。那么他的回答很好。 – djv 2013-03-07 00:18:24