VB無所不能之六:對程序運行的監控

VB無所不能之六:對程序運行的監控
 
——作者:鐘聲
 
轉眼間,本系列文章已經寫到了第六個,今天寫點什麼呢?
還是得寫,看似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.dll




















VB聲明: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方面的書:
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章