加载vb6时API计时器停止

加载vb6时API计时器停止,vb6,Vb6,你好, 我创建了一个具有自动注销功能的vb6程序。我使用了API,它工作得很好,但只在MDI子窗体上。无论何时以模态形式加载表单,计时器都会停止。我试图逐行模拟我的代码,然后发现代码停在“Form1.show vbmodal”上。即使是加载为vbmodal的表单,我应该如何继续计时?任何帮助都将不胜感激。提前谢谢。 顺便说一下,这是我的代码: Private Declare Function GetQueueStatus Lib "user32.dll" (ByVal fuFlags As Lo

你好, 我创建了一个具有自动注销功能的vb6程序。我使用了API,它工作得很好,但只在MDI子窗体上。无论何时以模态形式加载表单,计时器都会停止。我试图逐行模拟我的代码,然后发现代码停在“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

不太确定模态对话框会阻止任何代码运行,直到它关闭。。发件人:

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

如果窗体显示为模态,则显示方法后面的代码为 直到对话框关闭后才执行


如果你想让计时器启动,你必须放弃模态形式,转而使用另一种解决方案。

你实际上没有“计时器”。您有一个cpu密集型循环,该循环将运行一段时间,并且在该循环中进行api调用。
DoEvents
语句确实意味着当循环运行时,UI将(主要)响应用户

然后,当您调用模式窗体显示时(通过不同的代码路径,可能是由另一个事件(如按钮单击)触发),该模式窗体显示将在窗体以模式显示时停止cpu循环。正如庞德大师在他们的回答中所描述的那样

您应该研究使用计时器控件(和)


在计时器已过事件中,您将进行队列状态api调用。将计时器控件放置在主窗体上意味着计时器已过事件将继续激发,即使您已以模态方式显示另一个窗体。

谢谢C-Pound GuruI,我认为每当模态窗体加载时,我必须再次调用API计时器函数。谢谢MarkL,链接非常有用。