4

在 Form1 的顶部,我做了:

private Process zipFileDirectoryProcess;

在构造函数中我做了:

zipFileDirectoryProcess = new Process();
zipFileDirectoryProcess.StartInfo.FileName = "explorer.exe";
zipFileDirectoryProcess.StartInfo.CreateNoWindow = true;
zipFileDirectoryProcess.EnableRaisingEvents = true;
zipFileDirectoryProcess.Exited += new EventHandler(zipFileDirectoryProcess_Exited);

然后我有一个方法,我从按钮单击事件中调用它:

private void Compress()
{
  zipFileDirectoryProcess.StartInfo.Arguments = zipFileDirectoryProcess.StartInfo.Arguments = "/select," + Path.GetFullPath(t);
  zipFileDirectoryProcess.Start();
  zipFileDirectoryProcess.WaitForExit();
  this.TopMost = true;
}

然后在底部的 Exited 事件中:

private void zipFileDirectoryProcess_Exited(object sender, EventArgs e)
        {
            this.BeginInvoke(new MethodInvoker(delegate()
            {
                this.TopMost = false;
            }));
        }

我想要做的只是当我在方法中启动它后关闭进程窗口时,只有关闭窗口/进程然后执行 Exited 事件。

问题是,一旦进程在 2-3 秒后开始,它会自动跳转到 Exited 事件。

我该如何解决?尝试过的例子无法弄清楚。试图添加这一行:

zipFileDirectoryProcess.WaitForExit();

但是没有效果。

4

2 回答 2

5
   zipFileDirectoryProcess.StartInfo.FileName = "explorer.exe";

当 Windows Explorer 已经在运行并且一直在运行时,尝试再次启动它会产生令人失望的结果。这是一个“繁重”的过程,它有意尝试最小化运行副本的数量。否则称为“单实例应用程序”。有很多这样的,例如 Microsoft Office 程序是单实例应用程序。

所以真正发生的是 explorer.exe 实际启动,但看到另一个实例已经在运行。并使用进程互操作来要求第一个实例完成您要求它完成的工作。由于您没有要求它执行任何操作,因此您只会得到另一个窗口,由第一个实例显示。你开始的那个立即退出,它没有别的事情可做。

所以,是的,你会看到 Exited 事件在你没有做任何事情的情况下触发。准确告诉你,你启动的 explorer.exe 进程确实退出了。顺便说一句,在 Taskmgr.exe 进程选项卡中很容易看到。等待该窗口关闭永远不会起作用,它由 explorer.exe 的原始实例显示。

这不会像你希望的那样工作。您实际尝试做的事情不是很明显,但可以猜到。创建 ZIP 存档并不难,有很多优秀的库可用于 C# 来完成工作,没有必要让另一个程序为你做这件事。DotNetZip 和 SharpZipLib 非常流行。它最终在 4.5 版中也被添加到 .NET 中,微软终于克服了失去的 Stacker 诉讼,大约是时候了。如果您真的非常想要另一个程序为您执行此操作,请使用控制台模式拉链,如 7-zip。

于 2013-08-04T21:47:23.857 回答
0

要在 Windows 资源管理器中向用户显示输出文件夹,只需执行以下操作:

Process.Start("explorer.exe", OutputDir);
于 2013-08-04T23:46:21.483 回答