如果CommonDialog或MSGBOX的弹出画面不操作,程序都挂起了,怎么处理

如果CommonDialog或MSGBOX的弹出画面不操作,程序都挂起了,怎么办
定时器都没法执行到了,定时器是固定1分钟做采集数据用,但如果操作出现CommonDialog或MSGBOX的弹出画面,这时不做选择,则定时器无法按之前的间隔采集数据,这就是所谓的单线程?
------解决方案--------------------
估计是的,和弹出的窗体效果差不多
------解决方案--------------------
当前窗体弹出模态窗体,当前窗体的Timer会被阻塞。

你可以用一个隐藏的窗体承载Timer,然后用它Show出你的主窗体。这样主窗体再弹出MsgBox等等也不会影响那个隐藏窗体上的Timer执行啦。
------解决方案--------------------
只有在 VB 调试界面中(Design Time)执行才会有这种 MsgBox 影响 Timer 的情况,编译成 .exe 就不会了。

下面是一个简单例子,你编译成 .exe 运行试试看:
Option Explicit

Private Sub Command1_Click()
    MsgBox "ok"
End Sub

Private Sub Form_Load()
    Timer1.Interval = 100
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
    Label1 = Format(Now, "yyyy-dd-dd HH:nn:ss")
End Sub

甚至可以用 Timer 结束一个未响应的对话框:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long

Private Const WM_CLOSE = &H10
Private Const MsgTitle As String = "Test Message"

Private Sub Command1_Click()
Dim nRet As Long
Timer1.Interval = 3000
Timer1.Enabled = True
nRet = MsgBox("若您不回应的话,3 秒后此 MsgBox 会自动关闭", 64, MsgTitle)
Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
Dim hWnd As Long
hWnd = FindWindow(vbNullString, MsgTitle)
Call SendMessage(hWnd, WM_CLOSE, 0, ByVal 0&)
End Sub

同样的,这个例子也要在编译成 .exe 之后才生效。