VB无所不能之六:对程序运行的监控

VB无所不能之六:对程序运行的监控
 
——作者:钟声
博客地址:http://useway.blog.51cto.com
 
转眼间,本系列文章已经写到了第六个,今天写点什么呢?
还是得写,看似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方面的书:
 
Java程序员,上班那点事儿 》, 前言 , 目录
卓越网销售链接
China-pub销售链接
当当网销售链接
《Java程序员,上班那点事》纪念帖

 

你可能感兴趣的:(VB无所不能之六:对程序运行的监控)