我是Windows API编程的新手。我知道有办法检查进程是否已经运行(通过枚举)。但是,我想知道是否有一种方法可以监听进程何时开始和结束(例如,notepad.exe),然后在检测到该进程的开始或结束时执行某些操作。我假设每个边缘单位时间都可以运行一个连续的枚举和检查循环,但我想知道是否有更清洁的解决方案。
答案 0 :(得分:7)
使用WMI,Win32_ProcessStartTrace和Win32_ProcessStopTrace类。示例C#代码is here。
您需要编写等效的C ++代码。哪个,呃,不是那么紧凑。它主要是样板文件,生存指南是available here。
答案 1 :(得分:1)
如果您可以在内核中运行代码,请检查Detecting Windows NT/2K process execution。
答案 2 :(得分:1)
Hans Passant可能给了你最好的答案,但......用C或C ++写作是很慢而且相当重的。
在小于或等于Vista的Windows版本上,使用Windows WH_CBT
挂钩可以获得95%的覆盖率,可以使用SetWindowsHookEx
进行设置。
有一些问题:
这会错过一些服务启动/停止,您可以通过保留正在运行的启动列表并偶尔扫描列表中的更改来缓解这些启动/停止。您不必在此列表中保留具有explorer.exe作为父/祖父进程的过程。 Christian Steiber的proc处理理念适用于管理从表中删除过程。
它错过了内核直接执行的操作。这可以像#1一样减轻。
积极的是它非常轻巧,易于编写。
对于Windows 7及更高版本,请查看SetWinEventHook
。我没有编写代码来覆盖Win7,所以我没有评论。
答案 3 :(得分:0)
进程句柄实际上是可以“等待”的对象,类似于“WaitForMultipleObjects”。
虽然它不会发送某种通知,但您可以通过使用MsgWaitForMultipleObjects()版本的调用将其与消息处理相结合,将其作为事件循环的一部分。
答案 4 :(得分:0)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
\Image File Execution Options
您可以在此处放置一个注册表项和您的进程名称,然后添加一个名为“Debugger”的REG_SZ和您的列表器应用程序名称来中继进程启动通知。
不幸的是,我知道没有这样的零开销方法来接收流程退出。