如何检查 windows 是否启动了新进程?

How to check if a new process started in windows?

我正在尝试编写一个程序,在新进程启动时通知我。

我的第一个想法是在 python 中使用 psutil 并使用 sched[=25= 检查后台进程中的进程数] 每 5 秒检查一次。

但是获取新进程的进程 ID 有点复杂,因为我必须保存所有 运行 进程的列表并在五秒后将其与新列表进行比较。然后找出差异,得到新进程的id。

这个好像真的不行

有没有人知道一种更有效的方法来检查新进程并在它们启动时获取它们的进程 ID?我想最好的方法是在 windows api 中学习如何执行此操作,但 python 会容易得多。

提前致谢。

好吧,这是一个完整的工作程序,它完全可以满足您的要求。从开始到结束,开发时间大概只有 5 分钟。根据 psutil 文档,它应该 运行 在支持 python 的任何 OS 上。

我在Windows,所以我打开任务管理器观察了这个程序的CPU使用情况。它几乎总是零。偶尔我会看到一个很小的值,不会超过 3%。

我确信有一种方法可以减少执行时间,例如,请参阅 IInspectable 的评论。考虑到 python 和 psutil 提供的开发便利性,这值得吗?您是否关心性能改进是否会破坏跨平台兼容性?当然,只有您才能回答这些问题。但是除非您对浪费几个 CPU 周期非常敏感,否则我会选择最简单的解决方案并继续进行其他操作。

#! python3.8

import time

import psutil

old_set = set(list(psutil.process_iter()))
while True:
    new_set = set(list(psutil.process_iter()))
    added = new_set - old_set
    for p in added:
        print("New", p)
    old_set = new_set
    time.sleep(5.0)

感谢您的回答。

我很快想出的解决方案是

import psutil
import sched
import time

def checkNewProc():
    for p in psutil.process_iter():
    #print(p.create_time())
        epoch_time =int(time.time())
        if abs(p.create_time()- epoch_time)<2:
            print(p.name(),p.pid)
            
    event_schedule.enter(2, 1, checkNewProc)

event_schedule.enter(2, 1, checkNewProc)

event_schedule.run()

我尝试这样做的主要原因是为了更深入地了解管理流程。因此,像 IInspectable 中的答案这样的答案是我正在寻找的,以学习在更深层次上做这件事的新方法。 我不太关心处理时间。

所以我仍然对不同的方法持开放态度。

这就是我要找的东西

import wmi

c = wmi.WMI()
process_watcher = c.Win32_Process.watch_for("creation")
while True:
    new_process = process_watcher()
    print(new_process.Caption,process.ProcessId)

谢谢。我不知道 WMI。