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