8

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

4

5 回答 5

10

使用 WMI、Win32_ProcessStartTrace 和 Win32_ProcessStopTrace 类。示例 C# 代码在这里

您需要编写等效的 C++ 代码。哪个,呃,不是那么紧凑。它主要是样板文件,生存指南可在此处获得

于 2012-08-18T14:05:49.270 回答
1

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

于 2012-08-18T15:43:37.207 回答
1

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

在低于或等于 Vista 的 Windows 版本上,您可以使用 WindowsWH_CBT挂钩获得 95% 的覆盖率,该挂钩可以使用SetWindowsHookEx.

有几个问题:

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

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

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

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

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

于 2012-08-18T15:57:10.363 回答
0

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

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

于 2012-08-18T14:25:17.537 回答
0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
\Image File Execution Options

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

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

于 2012-08-18T15:21:20.493 回答