【问题标题】:C# - How to detect a process create/termination event WITHOUT using WMIC# - 如何在不使用 WMI 的情况下检测进程创建/终止事件
【发布时间】:2022-11-10 23:04:08
【问题描述】:

我正在尝试编写一个自动化软件来在不同的进程启动时执行某些事情,然后在它们关闭时执行另一件事。

我已经使用ManagementEventWatcher 成功地让它工作了。但是,这会在 Windows 中使用 WMI,这反过来会导致 WMI Provider Host 使用约 4% 的 CPU。我觉得这有点过分了。

有没有办法在没有极端 CPU 开销的情况下做我想做的事?

谢谢

【问题讨论】:

  • 有几种方法。 ManagementEventWatcher 是一种很好的解耦即发即弃的方法,但它可能有点密集。一种不那么密集但更“手动”的方法就是每隔几秒钟获取一次进程列表并搜索您正在寻找的进程。如果您可以访问其他程序,那么最不密集的解决方案是从其他程序向您的程序发送一条消息,指示它已启动,并传递进程 ID。这可以通过很多方式来完成。最常见的是匿名管道(仅限 Windows)或 TCP/UDP 套接字。
  • @Jesse 感谢您的反馈!不幸的是,我无法访问其他程序,因此任何形式的通信都不起作用。我的印象是获取所有进程并手动搜索会增加我的 CPU 使用率。无论如何我都会尝试一下,所以我不妨尝试一下,看看开销有多糟糕。再次感谢!

标签: c# .net


【解决方案1】:

我这样做的方式实际上与我最初的计划相反。

我无需监听进程启动/停止或轮询所有进程,而是简单地获取具有所需 exe 名称的所有进程,如果存在,我会做我想做的事。这是一些代码sn-p。

// All this goes into its own thread
while (true) // I use a boolean variable instead of true, so I can close it later
{
    Thread.Sleep(1000);
    foreach(string process in configuredProcesses) //configuredProcesses is a simple string list which contains the names of processes I am looking for
    {
        Process[] processes = Process.GetProcessesByName(process);
        if (processes.Length > 0)
        {
            // process exists, execute code
        }
    }
}

这种方法现在为我的进程使用了​​大约 0.1% 的 CPU,这比 WMI 的开销要好得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多