美好的一天, 我创建了一个具有自动注销功能的vb6程序。我使用API,它工作正常,但只适用于mdiChild表单。无论何时以模态形式加载表单,计时器都会停止。我试图逐行模拟我的代码,然后我发现代码停在" Form1.show vbmodal"。即使是作为vbmodal加载的表单,我该怎么做才能继续计时器?任何帮助将不胜感激。提前致谢。 顺便说一句,这是我的代码:
Private Declare Function GetQueueStatus Lib "user32.dll" (ByVal fuFlags As Long) As Long
'API For Inactivity Monitoring SMQ
Private Const QS_KEY = &H1
Private Const QS_MOUSEMOVE = &H2
Private Const QS_MOUSEBUTTON = &H4
Private Const QS_TIMER = &H10
Private Const QS_MOUSE = (QS_MOUSEMOVE Or QS_MOUSEBUTTON)
Private Const QS_INPUT = (QS_MOUSE Or QS_KEY)
Private Const QS_ALLEVENTS = (QS_MOUSE Or QS_KEY Or QS_TIMER)
Public Sub CheckInputIdle(ByVal TimeOut As Long)
Dim lTimer As Long
lTimer=Timer
Do While gCancelAutoLogOff = False
DoEvents
If GetQueueStatus(QS_INPUT) Then
lTimer = Timer
End If
If Timer - lTimer >= TimeOut Then Exit Do
Loop
If gCancelAutoLogOff = False Then
gCancelAutoLogOff = True
MainForm.Logoff
End If
End Sub
答案 0 :(得分:2)
不太确定你期望什么,因为模态对话框会阻止任何代码运行直到它关闭。来自Visual Basic Concepts: Modal and Modeless Dialog Boxes:
必须先关闭(隐藏或卸载)模式对话框 继续使用其他应用程序。
和
如果表单显示为模态,则Show方法后面的代码为 在对话框关闭之前不会执行。
如果你想让你的计时器开火,你将不得不摆脱你的模态形式而转向另一种解决方案。
答案 1 :(得分:0)
你实际上没有计时器'。你有一个cpu密集循环,它将运行一段时间,并在循环内你正在进行api调用。 DoEvents
语句确实意味着在循环运行时UI(大部分)将响应用户。
当您调用模式表单显示时(通过不同的代码路径,可能是由另一个事件触发,例如按钮单击),该模式表单显示将在模式显示表单时停止您的cpu循环。正如C-Pound Guru在回答中所描述的那样。
您应该调查使用定时器控件(https://msdn.microsoft.com/en-us/library/aa231154(v=vs.60).aspx和https://msdn.microsoft.com/en-us/library/aa267243(v=vs.60).aspx)。
在计时器已用事件中,您将进行队列状态api调用。将计时器控件放在主表单上意味着即使您以模态方式显示另一个表单,计时器已过时事件也将继续触发。