我正在编写一个程序,它在一个目录中启动一个随机文件。该文件可以是任何时间,但主要是视频或图像文件。每次启动一个文件时,我都想关闭之前打开的文件。代码是:
string FolderSelected = "";
string FileName = "";
Process proc;
List<string> FilesDisplayed = new List<string>();
public Form1()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
if (FolderSelected == string.Empty)
FolderSelected = Properties.Settings.Default.FilesDefaultFolder;
if (proc != null)
{
proc.CloseMainWindow();
proc.Close();
}
FileName = FetchRandomFile();
proc = Process.Start(FileName);
}问题是,我总是得到proc = null (文件已正确启动),并且我无法获取之前打开的进程来关闭它。我知道.NET重用了进程,这就是为什么它返回空的原因,但我需要重写这个行为。请帮帮忙,盖伊。
发布于 2010-08-11 15:59:15
编辑:多亏了leppie的评论,我想我知道答案了:我猜你是在“开始”一些类似于图像的东西,它是重用现有的进程来打开文档,而不是创建一个新的进程。
我用这个简单的测试应用重现了这段代码:
using System;
using System.Diagnostics;
public class Test
{
static void Main()
{
Process proc = Process.Start("image.tif");
Console.WriteLine(proc == null);
}
}这打印出"true“,因为它使用dllhost.exe来托管Windows Image Viewer,而不是创建一个新进程。
发布于 2013-06-19 09:29:57
要解决此问题,必须将UseShellExecute设置为false以绕过外壳。
而不是
Process.Start("filename", "args")`使用
Process.Start(new ProcessStartInfo() {
Filename = "filename",
Arguments = "args",
UseShellExecute = false
}发布于 2010-08-11 16:00:20
这甚至不会编译(确定的赋值)。作为一个方法变量,proc只对声明方法(/scope)是局部的-即button2_Click,这解释了为什么不能保留值。如果proc打算在调用之间持久化,则将其提升为一个字段(每个实例的变量):
Process proc;
private void button2_Click(object sender, EventArgs e)
{
if (proc != null)
...https://stackoverflow.com/questions/3456383
复制相似问题