C# 未调用进程退出的事件处理程序方法

C# 未调用进程退出的事件处理程序方法,c#,.net,C#,.net,下面是以下代码,进程。退出的事件处理程序方法没有被调用……我还通过断点和所有这些检查了这一点 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

下面是以下代码,
进程。退出的
事件处理程序方法没有被调用……我还通过断点和所有这些检查了这一点

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
}

我刚查过。以这种方式使用
Process
时,它不会将
Process
对象附加到实际流程。例如,如果尝试调用
Process.WaitForExit()
,则会出现异常。因此,当然退出的
事件也不能引发;
进程
对象无法知道哪个进程启动了,更不用说它何时退出了

如果要执行此操作,您需要启动实际的媒体播放器,为其提供必要的命令行参数或DDE谓词以播放特定文件,或者需要在启动进程后搜索现有进程,查找您认为是刚刚启动的进程的进程


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

我认为这是不可能的,因为无法保证在您打开这样的文件时启动进程

假设没有为文件类型“.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
}

这个过程真的在退出吗?您似乎正在播放.mp4文件。通常情况下,Windows会启动一些媒体播放器来执行此操作,但之后通常由用户关闭媒体播放器应用程序。进程不会仅仅因为播放完文件就自动退出。它是手动退出还是自动退出?是否将其传递给退出方法?是。但如果它根本不退出,你将永远看不到那个事件。为什么这个过程会退出?你要关闭媒体播放器吗?此外,我还没有检查,但我不能完全确定,当您以这种方式启动进程时(即使用Windows Shell启动基于文件关联的程序),
进程
对象实际上是否与该进程相关联。启动
进程后,应再次检查
对象,以确保其正确。显然,如果
进程
对象未附加到实际进程,则不会获得事件。是的,进程正在退出。。这只是一个10秒的视频…我不明白重复检查部分…请你说清楚一点,谢谢