不调用Process Exited事件处理程序方法

时间:2015-02-08 21:28:18

标签: c# .net

以下是以下代码... Process.Exited事件处理程序方法未被调用...我还通过断点检查了所有这些。

Process f;

private void button3_Click_1(object sender, EventArgs e)
{
    f = new Process();
    f.StartInfo.FileName = "tutorial.mp4";
    f.EnableRaisingEvents = true;
    f.Exited += new EventHandler(f_Exited);
    f.Start();
}

private void f_Exited(object sender, System.EventArgs e)
{
    //some stuff not important
}

2 个答案:

答案 0 :(得分:1)

我认为这是不可能的,因为当您打开这样的文件时,并不能保证进程完全启动。

假设没有为文件类型" .mp4"设置任何标准程序。然后Windows将要求用户选择一个程序来打开文件;但如果用户取消此操作并且根本不选择程序,则不会启动任何进程。因此,我相信在这种情况下,退出的事件根本不会被解雇,因为你不能依赖它。

我能想到的是用适当的命令行参数直接启动播放器,如下所示:

Process f;
private void  button3_Click_1(object sender, EventArgs e)
{
    f = new Process();
    f.StartInfo.FileName = "wmplayer.exe"; // or something other
    f.StartInfo.Arguments = @"c:\tutorial.exe"; // as for the wmplayer, you have to specify the whole path.
    f.EnableRaisingEvents = true;
    f.Exited += new EventHandler(f_Exited);
    f.Start();

}
private void f_Exited(object sender, System.EventArgs e)
{
    //some stuff not important
}

答案 1 :(得分:0)

我刚刚检查过。当您以这种方式使用Process时,它不会Process对象附加到实际进程。例如,如果您尝试调用Process.WaitForExit(),则会出现异常。所以当然也不能提出Exited事件; Process对象无法知道甚至开始的进程,从不介意它何时退出。

如果你想这样做,你需要启动实际的媒体播放器,为它提供必要的命令行参数或DDE动词来播放特定文件,或者你需要在启动后搜索现有的进程这个过程,寻找你认为刚刚开始的过程。

请注意,只有前一个选项是可靠的。理论上,在后一种情况下,您可能会找到媒体播放器的其他实例(取决于您使用的媒体播放器以及它是否可以作为多个实例运行)。