史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   技巧: 不讓訊息視窗卡住軟體運行 (For VB.Net) (http://forum.slime.com.tw/thread288484.html)

mini 2018-08-19 02:22 PM

技巧: 不讓訊息視窗卡住軟體運行 (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
.ElapsedAddressOf 延時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(vbNullStringMyProc.my參數.ToString)
                
SetParent(Handle0)
        
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:=TrueCharSet:=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 IntPtrByVal hWndNewParent As IntPtr) As IntPtr
    End 
Function 

===========

以上方法算是另類 "多執行續" 技巧
至於什麼時候可派上用場
就靠程式寫作家的想像力了
"不讓訊息視窗卡住軟體運行" 也只是技巧的一個牛刀小試


所有時間均為台北時間。現在的時間是 11:49 PM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1