史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2018-08-19, 02:22 PM   #1
mini
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時級別:96 | 在線時長:9664小時 | 升級還需:133小時
註冊日期: 2002-12-07
文章: 13248
精華: 0
現金: 26239 金幣
資產: 3024049 金幣
預設 教學 - 技巧: 不讓訊息視窗卡住軟體運行 (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 
===========

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

此帖於 2018-08-19 03:27 PM 被 mini 編輯.
mini 目前離線  
送花文章: 1999, 收花文章: 7956 篇, 收花: 26748 次
回覆時引用此帖
發文 回覆


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用

相似的主題
主題 主題作者 討論區 回覆 最後發表
Visual Basic .NET(繁體中文) a791004 一般電腦疑難討論區 9 2004-03-07 05:50 PM
Win2000用IIS架設ASP.NET網站(用動態IP架) 小布 網路軟硬體架設技術文件 0 2004-02-04 01:33 PM
net指令大暴光 psac 作業系統操作技術文件 1 2003-12-27 09:44 AM
為什麼會這樣啊?(net transport) 巧克力牛奶 一般電腦疑難討論區 1 2003-05-24 03:51 PM
請問..哪有WINDOWS.NETㄉ繁體語言包ㄋ? kadi 一般電腦疑難討論區 3 2002-12-19 03:31 PM


所有時間均為台北時間。現在的時間是 03:47 AM


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


SEO by vBSEO 3.6.1