2015-02-08 66 views
0

以下是以下代码... 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 
} 
+1

是过程实际上退出?您似乎在播放.mp4文件。通常,Windows会启动一些媒体播放器来做到这一点,但之后通常由用户来关闭媒体播放器应用程序。该过程不会因为完成播放文件而自动退出。 – 2015-02-08 21:40:31

+0

它是否已经手动或自动退出,不应该将它传递给退出方法? – 2015-02-08 21:42:22

+0

是的。但是如果它根本没有退出,你永远不会看到这个事件。流程为什么会退出?你关闭媒体播放器吗?另外,我还没有检查过,但我不完全确定,当你以这种方式启动一个进程时(例如,使用Windows Shell启动一个基于文件关联的程序),“Process”对象甚至实际上与处理。在启动它之后,您应该仔细检查'Process'对象以确保它是。如果'Process'对象没有附加到实际的进程,显然你不会得到事件。 – 2015-02-08 21:47:18

回答

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 
} 
0

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

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

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

相关问题