【问题标题】:How to get the PID of IRunningTask (Task Scheduler 2.0 library)如何获取 IRunningTask 的 PID(Task Scheduler 2.0 库)
【发布时间】:2011-05-30 09:51:49
【问题描述】:

我使用IRegisteredTask.Run() 开始了一项任务,并获得了IRunningTask 对象。

我的目标是使用 SetForegroundWindow 函数聚焦已启动任务的主窗口。

首先我想知道正在运行的任务的PID(进程ID)。

IRunningTask.EnginePID 属性,但它给了我一些taskeng.exe 进程(任务调度引擎)的PID,这不是我的任务...

如何获取IRunningTask的PID?

【问题讨论】:

  • 最终,使用 TASK_ACTION_EXEC 启动的命令行任务可以用任何东西表示,例如 3 个进程。任务计划程序并不总是具有“什么是”真正正在运行的任务的概念。您对此拥有的信息比其他任何信息都多,因为您知道自己实际推出了什么。你不能为此使用任何其他手段吗?如果您假设您可以使用 PID 做一些有趣的事情,那么您必须能够按名称或窗口枚举进程。

标签: c# .net process focus scheduled-tasks


【解决方案1】:

你是对的。 IRegisteredTask 接口不公开 PID 属性。

如果您确实需要 PID,您可能需要使用 IRegisteredTask 的 .Path 和 .Name 属性并枚举当前正在运行的进程以寻找匹配项。当您找到与 IRegisteredTask 具有相同路径和名称的当前正在运行的进程时,您可以检索 PID。它不漂亮,但它应该可以解决问题。

【讨论】:

  • 谢谢。这种方法的问题是任务可能同时有多个实例。
  • 您可以做的一件事(我以前也做过)就是在任务的主窗口中添加一个控件,以便携带您需要的信息。例如,向窗口添加一个 TextBox 并将控件的 Text 设置为某个唯一值(或 PID,或主窗体的 HWND)以供以后使用。然后在您找到您的应用程序后,使用 FindWindowEx 定位文本框并检索您的信息。是的,这是一个黑客。是的,应该有更好的方法。但是,是的,它会起作用。
  • 用户应用程序运行非提升,而任务运行提升,此方法在这种情况下不起作用。
【解决方案2】:

您不能使用 IRunningTask.InstanceGuid 获得它(然后通过 TaskScheduler.IRegisteredTaskCollection)吗?

--为完整性而编辑--

由于您的最终目标是获取任务本身,因此您可以通过使用引擎任务集合中的唯一 GUID 来实现。

【讨论】:

  • 我的目标是找到我刚刚开始的任务的 PID。我如何从 IRegisteredTaskCollection 中获取它?
  • 实际上你没有(如果有办法的话,我不会)。你只会得到任务本身。
  • 您是否尝试将 ComHandler 添加到任务中?如果您的目标实际上是获取 PID,您可以尝试在处理程序或任何其他 IAction 中获取调用者进程 ID,然后映射您的任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-05
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 2019-10-08
相关资源
最近更新 更多