【问题标题】:Until a process has started, do something在进程开始之前,做某事
【发布时间】:2020-04-29 11:50:42
【问题描述】:

所以我有一个以 Windows 启动的后台程序,最小化为系统托盘图标。加载后,我需要它不断开始检查进程是否已启动(例如 VLC)。一旦进程开始,它必须等待它关闭才能开始做事,然后再回来检查它是否已经开始。我一直在尝试这样做一段时间,但我就是不知道怎么做。

如何不断检查程序是否已启动?

【问题讨论】:

  • 如果您的应用具有管理员权限,您可以使用ManagementEventWatcher 类,将WqlEventQuery 设置为Win32_ProcessTrace。您可以指定进程名称或不指定名称,以接收与一个或所有进程相关的启动/终止事件。如果您需要示例,请告诉我。
  • 谢谢!我试试看。
  • 好的。请注意,当您使用这些查询时,Process 的名称需要全名:它包括扩展名(而 Process 类不需要它)。因此,如果您想在记事本启动/终止时收到通知,您必须指定“notepad.exe”作为监视进程的名称。

标签: c# windows winforms


【解决方案1】:

一种方法是让后台守护程序查找具有特定名称的程序。不幸的是,这并不太可靠(由于名称重叠),需要大量轮询并存在竞争条件的风险(当您的守护进程仍在工作时开始该进程)。

是可靠的,是 Deamon 是否真正启动了前台进程。这样它就可以在Process.Start() 之前和Process.WaitForExit() 之后工作,并在两种状态发生时提供完整信息:https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process?view=netcore-3.1

Steam 就是一个很好的例子。它是一个单实例进程,因此任何进一步的请求都可以中继到正在运行的实例。程序/游戏的桌面链接实际上是网络链接 - 不是程序链接。这些链接使用 :steam 协议,它与蒸汽过程相关联。所以它是这样的:

  • 用户使用 :steam procotoll 在 WebLink 上点击
  • Windows 将其解析为对 Steam 程序的命令行调用
  • 通过命令行以正确的顺序启动实例。单实例不允许启动第二个实例,而是将请求交给已经运行的实例
  • 已经或现在突然运行的实例调用程序,在它开始和结束时拥有完整的数据 - 作为实际的逻辑调用者

【讨论】:

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