2017-07-13 72 views
1

美好的一天, 我創建了一個具有自動註銷功能的vb6程序。我使用的API,它工作正常,但只在mdiChild形式。無論何時以模式形式加載表單,計時器都會停止。我嘗試逐行模擬我的代碼,然後發現代碼在「Form1.show vbmodal」上停止。我應該怎麼做才能繼續計時器,甚至將表格加載爲vbmodal?任何幫助將不勝感激。提前致謝。 對了,這裏是我的代碼:當VBModal窗體加載時,API計時器停止 - vb6

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 

回答

2

不太清楚你期待一個模式對話框將阻止任何代碼運行,直到它關閉。從Visual Basic Concepts: Modal and Modeless Dialog Boxes

模態對話框必須關閉(隱藏或卸載),然後 才能繼續與應用程序的其餘部分一起工作。

如果一個形式被顯示爲模態,下面的顯示方法的代碼是 ,直到關閉對話框不執行。

如果你想讓你的計時器觸發,你將不得不擺脫你的模態形式而採用另一種解決方案。

+0

感謝C-Pound Guru – codesdozer

+0

我想我必須在模態窗體加載時再次調用API Timer函數。 – codesdozer

0

你實際上沒有'計時器'。你有一個cpu密集型循環,它會運行一段時間,並且在循環內你正在做一個api調用。 DoEvents語句確實意味着在循環運行時UI將(主要)響應用戶。當你然後調用一個模態窗體顯示(通過不同的代碼路徑,大概是由另一個事件觸發的,比如點擊按鈕),該模態窗體顯示將在模態顯示窗體時停止你的cpu循環。正如C-Pound Guru在他們的回答中所描述的那樣。

您應該使用定時器控件(https://msdn.microsoft.com/en-us/library/aa231154(v=vs.60).aspxhttps://msdn.microsoft.com/en-us/library/aa267243(v=vs.60).aspx)進行調查。

在定時器已過期的事件中,您將使您的隊列狀態api調用。將定時器控件放置在主窗體上將意味着即使您以模態方式顯示另一個窗體,定時器已用事件也將繼續觸發。

+0

感謝MarkL,這些鏈接很有幫助。 – codesdozer