技巧: 不讓訊息視窗卡住軟體運行 (For VB.Net)
當程式裡使用
MessageBox.Show("ABC")
或
MsgBox("ABC")
後程式步驟就會停在此行等待使用者的選擇
但有時不想等候,好讓程式再做一些小動作的話
要怎麼辦呢?
這裡就提供一個
不使用: 自己畫一個 Form來取代 對話框/訊息 視窗 之方法
雖然有點麻煩
但可以讓你的程式繞過一些限制達成一些特殊技巧
首先加入一個
PHP 語法:
Imports System.Timers
Public Class 緩衝器Class
Dim 延時Timer As System.Timers.Timer
Public myMode As Integer = 0
Public my參數 As Object
Public Event my程序() '宣告一可由外部連結之事件 之結構
Public Sub 延時_Do(ByVal 計數值 As Integer)
On Error GoTo LB_ErrorHandler
延時Timer = New System.Timers.Timer
AddHandler 延時Timer.Elapsed, AddressOf 延時Event
延時Timer.AutoReset = False
延時Timer.Interval = 計數值
延時Timer.Start()
Exit Sub
LB_ErrorHandler:
除錯用.內文 = "延時_Do"
Resume Next
End Sub
Private Sub 延時Event(ByVal source As Object, ByVal e As ElapsedEventArgs)
On Error GoTo LB_ErrorHandler
延時Timer.Stop()
RaiseEvent my程序() '觸發(外部)事件
RemoveHandler 延時Timer.Elapsed, AddressOf 延時Event
延時Timer.Dispose()
延時Timer = Nothing
Exit Sub
LB_ErrorHandler:
除錯用.內文 = "延時Event"
Resume Next
End Sub
主程式裡對應上面的 緩衝器Class
一個
Dim WithEvents MyProc As New 緩衝器Class '宣告一事件class <* 由"緩衝器Class"提供觸發事件 *>
PHP 語法:
Private Sub my程序_Do() Handles MyProc.my程序 '須與 緩衝器Class內宣告的結構相同
On Error GoTo LB_ErrorHandler
Select Case MyProc.myMode
Case 1 '**Handleg視窗脫離 MID
Dim Handle As IntPtr = FindWindow(vbNullString, MyProc.my參數.ToString)
SetParent(Handle, 0)
End Select
Exit Sub
LB_ErrorHandler:
除錯用.內文 = "my程序_Do 錯誤"
Resume Next
End Sub
如此就完成
那要怎麼使用
請看...
Dim C As String = APP_NAME & " 除錯Log"
MyProc.my參數 = C
MyProc.myMode = 1
MyProc.延時_Do(500) ' 延時執行,因為下方MsgBox還未出現
Dim BR As System.Windows.Forms.DialogResult = MessageBox.Show("ABC", C)
上方的 藍字 是使用前宣告
先決定好 傳入參數(my參數) 及 使用模式(myMode)
讓MyProc 等待 500ms後再執行
500ms後 此時MessageBox.Show 已完成顯現
就可以針對 它執行 "脫離MID" 動作 (因為 它與 主程式視窗是 MID關係)
SetParent(Handle, 0) 裡面的 0 是桌面HWnd,也就是把 它的父層 改成桌面
使用到WinAPI
PHP 語法:
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Friend Shared Function FindWindow( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As IntPtr
End Function
<DllImport("user32.dll", SetLastError:=True)>
Friend Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
End Function
===========
以上方法算是另類 "多執行續" 技巧
至於什麼時候可派上用場
就靠程式寫作家的想像力了
"不讓訊息視窗卡住軟體運行" 也只是技巧的一個牛刀小試
|