繁体   English   中英

如何检查窗口是否已打开?

[英]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来检查该窗口的详细信息。

以下链接可能会帮助您。

Process.MainWindowHandle的异常行为

在C#中获取进程的MainWindowHandle

据我所知,.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM