[英]How can I check if a window is already open?
我有一个程序,该程序创建一个.png图像,然后使用默认程序打开该图像以向用户显示该图像。
我的问题是,如果用户保持打开状态,我不希望它再次打开图像,我的意思是,如果用户不关闭图像,则我不希望再次打开显示相同内容的窗口。
System.Diagnostics.Process myProcess = new Process();
myProcess.StartInfo.FileName = @"Labyrinth.png";
myProcess.Start();
有谁知道用Windows Photo Viewer或您使用的任何默认程序检查图像是否打开的方法。
您可以使用Process.MainWindowHandle并使用Win32本机API来检查该窗口的详细信息。
以下链接可能会帮助您。
据我所知,.NET框架不直接支持此功能,但是您可以使用P / Invoke到Win32 API并获取详细信息。
希望这对您有所帮助。
这里的主要问题是,您基本上对正在启动的程序一无所知,只知道它与.png文件相关联,因此检查Windows可能非常因情况而异,并且通常不可靠。
我要做的是改为检查整个过程。 在打开第二个png时,请检查第一个进程是否仍在运行,如果仍然存在则不要打开。 HasExited属性用于此目的。 尝试这样的事情:
private Process previousProcess = null;
public CreateImage()
{
//Here put png creation as you already have
//Now attempt to open it if the previous instance has closed
if(this.previousProcess == null || this.previousProcess.HasExited)
{
//Either there was no previous image opened or it was already closed, go ahead and open it
Process myProcess = new Process();
myProcess.StartInfo.FileName = @"Labyrinth.png";
myProcess.Start();
//Cache the newly launched process to check for it afterwards
this.previousProcess = myProcess;
}
}
请注意,这依赖于您的程序在连续两个世代中保持打开状态,因此它不会检测到图像是否保持打开状态,而是关闭并重新打开程序。 同样,用户可能会重复使用为图像打开的相同程序来执行其他操作,从而有效地关闭图像,但不会关闭该过程,在这种情况下,将不会显示进一步生成的图像。
当然,所有这一切的解决方法是提供某种方式在您自己的程序中显示图像,并且如果有类似的选择,还可以为用户提供启动程序的选项,从而完全避免了问题。
如果基础OS进程已经终止,则似乎不需要Dispose()
上一个对象,因此删除该行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.