我想要监控系统中某个进程的启动情况,请问如何做,大概给一个思路~~~比如说我打开了一个记事本,我的程序可以立即反应并且提示有一个记事本打开了~~~用钩子吗?高人指点~

解决方案 »

  1.   

    是的  用全局钩子每次 进程启动的时候 会调用 你 钩子dll 中的 DllMain 函数
    在调用这个  DllMain 函数过程 中你可以向你的 应用程序 发信息这比 守侯进程 的优点是 实时,不需要论询  而且不会 遗漏进程 (有的进程 启动了不久 就退出)
      

  2.   

    不能用钩子,所谓的全局钩子也只是对已经运行的线程有作用。
    要想系统通知你新的线程运行了,你可以使用APC方法,写一个驱动,主要的两个函数是:
    KeInitializeApc KeInsertQueueApc,在CODEPROJECT.COM中几篇文章你可以看看。
      

  3.   

    使用WMI
    参考例子:
    Option Explicit
    Dim Locator As SWbemLocator
    Dim Services As SWbemServices
    Dim WithEvents StatusSink As SWbemSinkPrivate Sub KillEvents()
        StatusSink.Cancel
        Set StatusSink = Nothing
    End SubPrivate Sub Form_Load()
        Dim Query As String    Set StatusSink = New SWbemSink
        Set Locator = CreateObject("WbemScripting.SWbemLocator")
        Set Services = Locator.ConnectServer()    Query = "SELECT * FROM __InstanceCreationEvent "
        Query = Query + "WITHIN 1 "
        Query = Query + "WHERE TargetInstance ISA 'Win32_Process'"    Services.ExecNotificationQueryAsync StatusSink, Query
    End Sub
    Private Sub StatusSink_OnObjectReady(ByVal StatusEvent As SWbemObject, _
                                         ByVal EventContext As SWbemNamedValueSet)    Dim arr
        Dim strQue As String
        Dim i As Integer    List1.Clear
        arr = Split(StatusEvent.GetObjectText_, Chr(10))
        For i = LBound(arr) To UBound(arr)
            List1.AddItem arr(i)
        Next i
    End Sub
    Private Sub StatusSink_OnCompleted(ByVal HResult As WbemErrorEnum, _
                                       ByVal ErrorObject As SWbemObject, _
                                       ByVal EventContext As SWbemNamedValueSet)    If HResult <> wbemErrCallCancelled Then
            '错误处理
        End If
    End Sub
      

  4.   

    触发WMI中的:StatusSink_OnObjectReady()