我是 Windows API 编程的新手。我知道有一些方法可以检查进程是否已经在运行(通过枚举)。但是,我想知道是否有一种方法可以监听进程何时开始和结束(例如,notepad.exe),然后在检测到该进程的开始或结束时执行一些操作。我假设可以为每个边际时间单位运行连续枚举和检查循环,但我想知道是否有更清洁的解决方案。
5 回答
如果您可以在内核中运行代码,请检查Detecting Windows NT/2K process execution。
Hans Passant 可能已经给了你最好的答案,但是……用 C 或 C++ 编写速度很慢而且相当重。
在低于或等于 Vista 的 Windows 版本上,您可以使用 WindowsWH_CBT
挂钩获得 95% 的覆盖率,该挂钩可以使用SetWindowsHookEx
.
有几个问题:
这会错过一些服务启动/停止,您可以通过保留正在运行的 procs 列表并偶尔扫描列表以查找更改来缓解这些问题。您不必在此列表中保留将 explorer.exe 作为父/祖父进程的 proc。Christian Steiber 的 proc 句柄理念非常适合管理从表中删除 proc。
它错过了内核直接执行的东西。这可以通过与#1 相同的方式来缓解。
- 有些行为不端的应用程序不遵循挂钩系统规则,这可能会导致您的应用程序错过通知。同样,这可以通过保留进程表来缓解。
积极的一面是它非常轻巧且易于编写。
对于 Windows 7 及更高版本,请查看SetWinEventHook
. 我还没有编写涵盖 Win7 的代码,所以我没有意见。
进程句柄实际上是您可以“等待”的对象,例如“WaitForMultipleObjects”。
虽然它不发送某种通知,但您可以通过使用 MsgWaitForMultipleObjects() 版本的调用将其与消息处理结合起来,将其作为事件循环的一部分。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
\Image File Execution Options
您可以在此处使用您的进程名称放置一个注册表项,然后添加一个名为“Debugger”的 REG_SZ 和您的列表器应用程序名称以中继进程启动通知。
不幸的是,我知道没有这样的零开销方法来接收进程退出。