【问题标题】:Kill process started with System.Diagnostic.Process.Start("FileName")终止进程以 System.Diagnostic.Process.Start("FileName")
【发布时间】:2011-04-20 07:49:51
【问题描述】:

我正在尝试创建一个将在特定时间执行操作的应用程序(很像 Windows 任务计划程序)。我目前正在使用 Process.Start() 来启动任务所需的文件(或 exe)。

我通过调用文件(.mp3)来启动一个进程,该进程启动 WMP(因为它是默认应用程序)。到目前为止,一切都很好。现在我想杀死那个进程。我知道在这种情况下 Process.Start(string, string) 不返回任何内容(C# 中为 null)是正常行为。

所以我问当我通过 Process.Start(string, string) 调用 WMP 时如何关闭它??

编辑:

请注意,我不是直接使用 Process.Start() 打开 WMP,这是我运行该进程的行:

VB: Me._procs.Add(Process.Start(Me._procInfo))

C#:this._procs.Add(Process.Start(this._procInfo))

_procInfo 是一个 ProcessStartInfo 实例。 _procInfo.FileName 是“C:\route\myFile.mp3”。这就是 WMP 打开的原因。在任何情况下,所有的 Start() 方法,除了返回布尔值的 instance-one 之外,什么都不返回(在 C# 中为 null),因为 WMP 不是直接创建的进程(请注意 WMP 正在运行并且歌曲确实播放)。

【问题讨论】:

  • 据我所知,Process.Start 只会在没有实际启动进程的情况下返回null,例如重用现有流程来加载文档(在您的情况下为 mp3 文件)。你真的想杀死一个你的代码实际上没有启动的进程吗?
  • @Ani - 静态 Start 调用全部返回 Process 但成员函数返回 bool
  • @Steve Townsend:是的,但我相信 OP 正在谈论静态方法。如果对非空 Process 对象的引用已经可用,则问题不存在。
  • @0xA3,我的错 :),混淆了静态函数和成员函数
  • 这是我正在使用的重载:Process.Start(Me._procInfo)。这会打开 WMP 但什么也不返回。

标签: c# .net vb.net


【解决方案1】:

Process.Start(string,string) 返回一个 Process 资源,您可以使用它来进一步控制新进程。

Process newProcess = Process.Start("param1", "param2");
if (newProcess != null && !newProcess.HasExited)
  newProcess.Kill();

如果您使用 Process.Start(string) 或任何其他静态 Process.Start 重载,则相同的结构也有效。

Process.Start() 是一个成员函数,它将新的或重用的Process 与由此标识的Process 组件相关联。此方法的行为取决于 this 标识的 Process 的属性。

【讨论】:

  • 最佳答案。一个问题:用户可能已经关闭了从Process.Start 启动的应用程序,在这种情况下,句柄不会为空,但如果您调用Kill(),它会爆炸。将 kill 包裹在 try/catch 中,您将是安全的。
【解决方案2】:

不要这样做。

尚不清楚您的程序的意图是“始终使用 Windows Media Player 启动”还是“使用注册的 MP3 播放器启动”,比如 iTunes。

如果您需要 WMP,请使用 Process.Start 以及 windows 媒体播放器的完整路径。

如果您需要注册的 MP3 播放器,您可以使用the code shown here 找到正确的 exe。同样,使用这个 exe 路径启动进程,将 MP3 作为参数传递。

【讨论】:

  • 谢谢!你也给了我3k多的小费。 :)
【解决方案3】:

两种方式:

1-

Process customProc = Process.Start("ExecutablePath", "Argument(s)");  
customProc.Kill()

2-

Dim pProcess() As Process = System.Diagnostics.Process.GetProcessesByName("ProcessName")  
For Each p As Process In pProcess
p.Kill()
Next

【讨论】:

  • 关于这个的事情是,因为我不是启动程序的人(我只是调用文件,Windows 正在处理它应该打开的程序) Process.Start 什么都不返回(C# 为 null )。
【解决方案4】:

如果您让注册的 windows 程序打开文件,而不是选择您想要的程序。那我建议你不要杀掉这个进程。

这是因为您的程序确实使用了默认应用程序,但该应用程序已在使用中,并且包含未保存的数据。用户会不高兴您的程序用新文件取代应用程序,然后终止用户已经出于其他目的使用的进程。当然,它可能不会被使用,但你必须考虑最坏的情况。

因此,我推荐所建议的内容。使用 Process.Start() 以及要使用的程序和要打开的文件的完整路径。

【讨论】:

    【解决方案5】:

    我尝试打开 .txt 文件并返回了我的文本编辑器的进程,我也尝试了 WMP 的 .mp3 并返回 null。所以这取决于应用程序。你需要只用 WMP 运行你的 mp3 吗?如果没有,您绝对可以创建将返回 Process 对象的应用程序。

    【讨论】:

      【解决方案6】:

      proc = Process.Start(filename) 应该可以工作,但就像你说的,它返回 null 而不是进程。

      这似乎是 Windows Media Player 所固有的。其他应用程序返回该进程。您可以通过在start方法中指定应用程序来获取Windows Media Player的进程。

      proc = Process.Start("C:\Program Files\Windows Media Player\wmplayer.exe", filename)
      

      那么你就可以正常杀死了。

      proc.Kill()
      

      您可能需要从注册表中获取与 .mp3 文件关联的应用程序的位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-23
        • 1970-01-01
        • 1970-01-01
        • 2022-07-18
        • 1970-01-01
        相关资源
        最近更新 更多