API 计时器在 VBModal 表单加载时停止 - vb6



美好的一天, 我创建了一个具有自动注销功能的 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

不太确定您期望的模式对话框会阻止任何代码运行,直到它被关闭。从 Visual Basic 概念:模式和无模式对话框:

必须先关闭(隐藏或卸载(模式对话框,然后才能 继续使用应用程序的其余部分。

如果窗体显示为模式,则 Show 方法后面的代码为 在关闭对话框之前不执行。

如果您希望触发计时器,则必须摆脱模态形式,转而使用另一种解决方案。

你实际上没有"计时器"。 您有一个 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 调用。 将计时器控件放在主窗体上意味着计时器已用事件将继续触发,即使您以模式显示另一个窗体也是如此。

最新更新