用 VB 建立运行程序监视系统
作者:武汉 艾军
 很多的系统监视软件可以记录系统自启动以来运行过哪些程序,这在 VB 中是如何实现的呢?在VB 中使用 API 函数 EnumWindows  可以遍查所有窗口,而 API 函数 GetWindowText 可以取得窗口的标题,通过这两个函数可以取得当前系统里运行的所有窗口的标题(也可以说是取得正在运行的程序),如果在加上 Timer 控件就能实现上面的功能了。
下面的例子将介绍如果建立系统监视系统。
装载一个 Timer 控件,其 Interval 属性设为 60,其他值为默认。
Form1.frm 代码如下:
Private Sub Timer1_Timer()
   EnumWindows AddressOf EnumProc, 0 '枚举窗口列表中的所有父窗口(顶级和被所有窗口)
End SubModule1.bas 代码如下:
Option Explicit
Dim title, titleall As String
Dim i As IntegerPublic Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Any, ByVal lParam As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As LongPublic Function EnumProc(ByVal app_hwnd As Long, ByVal lParam As Long) As Boolean
Dim buf As String * 1024
Dim length As Long
    length = GetWindowText(app_hwnd, buf, Len(buf))
    title = Left$(buf, length) '取得窗口标题If title <> "" Then
    If InStr(titleall, title) Then
            EnumProc = 1
            i = 0
    Else
            titleall = titleall + title
            Debug.Print title '请将"立即窗口"打开(按Ctrl+G),查看窗口的变化
            i = i + 1
    End If
End If
If i = 1000 Then EnumProc = 0 '退出 EnumProc 
EnumProc = 1 
End Function
运行这个例子,通过"立即窗口"可以看到系统中的所有窗口标题 ,如果这里你在打开新的窗口将马上在"立即窗口"中看到新的窗口标题,也就是说实现了即时监视程序的运行情况,当然这只是最基础的操作,只要你加以修改、完善就可以运用在系统监视软件中。
上述程序在 Windows 98、VB 6.0 下运行良好,如果大家还有什么问题可到 www.d1vb.com(对编辑的话:1个VB论坛,我总在面) 来我们一起讨论。
API 注释:
EnumWindows 
语法:Declare Function EnumWindows& Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) 
说明 :枚举窗口列表中的所有父窗口(顶级和被所有窗口) 
返回值 :Long,非零表示成功,零表示失败 
参数表 
参数 类型及说明 
lpEnumFunc Long,指向为每个子窗口都调用的一个函数的指针。用AddressOf运算符获得函数在标准模式下的地址 
lParam Long,在枚举期间,传递给dwcbkd32.ocx定制控件之EnumWindows事件的值。这个值的含义是由程序员规定的 GetWindowText 
语法:Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long 
说明 :取得一个窗体的标题(caption)文字,或者一个控件的内容(在vb里使用:使用vb窗体或控件的caption或text属性) 
返回值 :Long,复制到lpString的字串长度;不包括空中止字符。会设置GetLastError 
参数表 
参数 类型及说明 
hwnd Long,欲获取文字的那个窗口的句柄 
lpString String,预定义的一个缓冲区,至少有cch+1个字符大小;随同窗口文字载入 
cch Long,lpString缓冲区的长度

解决方案 »

  1.   

    Private Const FILE_NOTIFY_CHANGE_ATTRIBUTES = &H4
    Private Const FILE_NOTIFY_CHANGE_DIR_NAME = &H2
    Private Const FILE_NOTIFY_CHANGE_FILE_NAME = &H1
    Private Const FILE_NOTIFY_CHANGE_SIZE = &H8
    Private Const FILE_NOTIFY_CHANGE_LAST_WRITE = &H10
    Private Const FILE_NOTIFY_CHANGE_SECURITY = &H100
    Private Const FILE_NOTIFY_CHANGE_ALL = &H4 Or &H2 Or &H1 Or &H8 Or &H10 Or &H100
    Private Declare Function FindFirstChangeNotification Lib "kernel32" Alias "FindFirstChangeNotificationA" (ByVal lpPathName As String, ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long) As Long
    Private Declare Function FindCloseChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
    Private Declare Function FindNextChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long
    Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Private Declare Function ResetEvent Lib "kernel32" (ByVal hEvent As Long) As Long
    Private Sub Form_Load()
        'KPD-Team 2000
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        Dim Ret As Long
        'Set the notification hook
        Ret = FindFirstChangeNotification("C:\", &HFFFFFFFF, FILE_NOTIFY_CHANGE_ALL)
        'Wait until the event is triggered
        WaitForSingleObject Ret, &HFFFFFFFF
        MsgBox "Event Triggered for the first time"
        'Reactivate our hook
        FindNextChangeNotification Ret
        'Wait until the event is triggered
        WaitForSingleObject Ret, &HFFFFFFFF
        MsgBox "Event Triggered for the second time"
        'Remove our hook
        FindCloseChangeNotification Ret
    End Sub
      

  2.   

    NT / 2K下最好用 ReadDirectoryChangesW
    这是标准的方法。
    另外可以用VXD/WDM,代价太大,不推荐。
      

  3.   

    NT / 2K下最好用 ReadDirectoryChangesW
    这是标准的方法。
    另外可以用VXD/WDM,代价太大,不推荐。
      

  4.   

    在NT或2K下用事件查看器,对需要观察的目录增加审核功能即可,何必编程,麻烦.