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

时间:2014-11-01 02:45:17

标签: c#

我有一个程序可以创建.png图像,然后使用默认程序打开图像,向用户显示图像。

我的问题是我不希望它再次打开图像,如果用户将其打开,我的意思是如果用户没有关闭图像我不想要第二个窗口打开显示同样的事情。

System.Diagnostics.Process myProcess = new Process();
myProcess.StartInfo.FileName = @"Labyrinth.png";
myProcess.Start(); 

有人知道如何使用Windows照片查看器或您使用的任何默认程序检查图像是否已打开。

2 个答案:

答案 0 :(得分:1)

您可以使用Process.MainWindowHandle并使用Win32 Native API检查该窗口的详细信息。

以下链接可以为您提供帮助。

Unexpected behaviour of Process.MainWindowHandle

Getting MainWindowHandle of a process in C#

据我所知,.NET框架不直接支持这个东西,但你可以使用P / Invoke到Win32 API并获得详细信息。

希望这对你有所帮助。

答案 1 :(得分:0)

这里的主要问题是你基本上对你正在启动的程序一无所知,只知道它与.png文件相关联,所以检查窗口可能是特定情况的,通常不可靠

我要做的是检查整个过程。在打开第二个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;
    }
}

请注意,这依赖于您的程序连续两代保持打开状态,因此它不会检测您是否保持图像打开,而是关闭并重新打开您的程序。此外,用户可能会重复使用为图像打开的相同程序来执行其他操作,从而有效地关闭图像而不关闭过程,在这种情况下,将不会显示进一步生成的图像。

当然,所有这一切的解决方法是提供一些方法在您自己的程序中显示图像,并可选择为用户提供一个选项,以便用它启动程序,从而完全避免问题。

修改

如果基础操作系统进程已经终止,那么它似乎不是Dispose()前一个对象所必需的,所以删除了该行。