VB無所不能之六:對程式啟動並執行監控
——作者:鐘聲
部落格地址:http://blog.csdn.net/useway
轉眼間,本系列文章已經寫到了第六個,今天寫點什麼呢?還是得寫,看似VB做不到的事情,那麼今天起就寫寫VB對作業系統的控制吧。 首先,說一說,VB對於被調用後的程式的監控方法。
原型函數簡介:
WaitForSingleObject
位置: Kernel32.dll
VB聲明:Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
說明:
參數hHandle是一個事件的控制代碼,第二個參數dwMilliseconds是時間間隔。如果事件是有訊號狀態返回WAIT_OBJECT_0,如果時間超過dwMilliseconds值但時間事件還是無訊號狀態則返回WAIT_TIMEOUT。
hHandle可以是下列對象的控制代碼:
Change notification
Console input
Event
Job
Memory resource notification
Mutex
Process
Semaphore
Thread
Waitable timer
WaitForSingleObject函數用來檢測hHandle事件的訊號狀態,當函數的執行時間超過dwMilliseconds就返回,但如果參數dwMilliseconds為INFINITE時函數將直到相應時間事件變成有訊號狀態才返回,否則就一直等待下去,直到WaitForSingleObject有傳回值才執行後面的代碼。此外,當dwMilliseconds設定為特殊值0時,測試hHandle核心對象是否被激發,函數立即返回。
傳回值:
WAIT_ABANDONED 0x00000080:當hHandle為mutex時,如果擁有mutex的線程在結束時沒有釋放核心對象會引發此傳回值。
WAIT_OBJECT_0 0x00000000 :核心對象已被啟用
WAIT_TIMEOUT 0x00000102:等待逾時
WAIT_FAILED 0xFFFFFFFF :出現錯誤,可通過GetLastError得到錯誤碼。
CloseHandle
位置: Kernel32.dllVB聲明:Declare Function CloseHandle Lib "kernel32" Alias "CloseHandle" (ByVal hObject As Long) As Long
說明 :
關閉一個核心對象。其中包括檔案、檔案對應、進程、線程、安全和同步對象等。涉及檔案處理時,這個函數通常與vb的close命令相似。應儘可能的使用close,因為它支援vb的差錯控制。注意這個函數使用的檔案控制代碼與vb的檔案編號是完全不同的
傳回值:Long,非零表示成功,零表示失敗。會設定GetLastError
參數表
參數 類型及說明
hObject Long,欲關閉的一個對象的控制代碼
註解
除非對核心對象的所有引用都已關閉,否則該對象不會實際刪除 OpenProcess
位置: Kernel32.dll
VB聲明:Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
說明:OpenProcess 函數用來開啟一個已存在的進程對象,並返回進程的控制代碼。
傳回值:
如成功,傳回值為指定進程的控制代碼。
如失敗,傳回值為空白,可調用GetLastError獲得錯誤碼。 好,我們來做一下實驗:
步驟1:建立一個項目;
步驟2:在視窗上建立一個按鈕;
步驟3:在預設表單中加入如下代碼:
Private
Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Const INFINITE = -1&
Const SYNCHRONIZE = &H100000
Private
Sub Command1_Click()
Dim i As Long
Dim r As Long
Dim p As Long
i = Shell("NOTEPAD.EXE", vbNormalFocus)
p = OpenProcess(SYNCHRONIZE, False, i)
r = WaitForSingleObject(p, INFINITE)
r = CloseHandle(p)
MsgBox "記事本已經關閉"
End Sub
運行該程式得到如下畫面: 當點擊“Command1”的時候,記事本被開啟,當關閉記事本的時候,彈出提示框“記事本已經關閉”。 本程式示範了,如何用API控制VB開啟的程式,的簡單應用。'''
鐘聲寫的關於Java方面的書:
《Java程式員,上班那點事兒》:
前言,
目錄
卓越網銷售連結
China-pub銷售連結
噹噹網銷售連結
《Java程式員,上班那點事》紀念帖
關於下載《Java程式員,上班那點事兒》的電子版