【问题标题】:Listen For Process Start and End监听进程开始和结束
【发布时间】:2012-08-14 16:35:39
【问题描述】:

我是 Windows API 编程的新手。我知道有一些方法可以检查进程是否已经在运行(通过枚举)。但是,我想知道是否有一种方法可以监听进程何时开始和结束(例如 notepad.exe),然后在检测到该进程的开始或结束时执行一些操作。我假设可以为每个边际时间单位运行一个连续的枚举和检查循环,但我想知道是否有更清洁的解决方案。

【问题讨论】:

    标签: c++ winapi visual-c++


    【解决方案1】:

    使用 WMI、Win32_ProcessStartTrace 和 Win32_ProcessStopTrace 类。示例 C# 代码is here

    您需要编写等效的 C++ 代码。哪个,呃,不是那么紧凑。大部分都是样板,生存指南是available here

    【讨论】:

      【解决方案2】:

      进程句柄实际上是您可以“等待”的对象,例如“WaitForMultipleObjects”。

      虽然它不会发送某种通知,但您可以通过使用 MsgWaitForMultipleObjects() 版本的调用将其与消息处理结合起来,将其作为事件循环的一部分。

      【讨论】:

      • 如何使用等待来监控进程创建?
      【解决方案3】:
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
      \Image File Execution Options
      

      您可以在此处使用您的进程名称放置一个注册表项,然后添加一个名为“Debugger”的 REG_SZ 和您的列表器应用程序名称以传递进程启动通知。

      不幸的是,我知道没有这种零开销的方法来接收进程退出。

      【讨论】:

        【解决方案4】:

        如果您可以在内核中运行代码,请检查Detecting Windows NT/2K process execution

        【讨论】:

          【解决方案5】:

          Hans Passant 可能已经给了你最好的答案,但是...用 C 或 C++ 编写速度很慢而且相当重。

          在低于或等于 Vista 的 Windows 版本上,您可以使用 Windows WH_CBT 挂钩获得 95% 的覆盖率,该挂钩可以使用 SetWindowsHookEx 进行设置。

          有几个问题:

          1. 这会错过一些服务启动/停止,您可以通过保留正在运行的 procs 列表并偶尔扫描列表以查找更改来缓解这些问题。您不必在此列表中保留将 explorer.exe 作为父/祖父进程的 proc。 Christian Steiber 的 proc handle 理念非常适合管理从 table 中删除 proc。

          2. 它错过了内核直接执行的东西。这可以通过与 #1 相同的方式来缓解。

          3. 有些行为不端的应用程序不遵循挂钩系统规则,这可能会导致您的应用程序错过通知。同样,可以通过保留进程表来缓解这种情况。

          积极的一面是它非常轻量级且易于编写。

          对于 Windows 7 及更高版本,请查看 SetWinEventHook。我还没有编写覆盖 Win7 的代码,所以我没有 cmets。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-14
            • 2022-11-05
            • 2018-07-21
            • 2016-08-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多