【问题标题】:How can I check if a window is already open?如何检查一个窗口是否已经打开?
【发布时间】:2014-11-02 00:15:25
【问题描述】:

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

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

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

有没有人知道一种方法来检查图像是否使用 Windows 照片查看器或您使用的任何默认程序打开。

【问题讨论】:

标签: c#


【解决方案1】:

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

以下链接可能会对您有所帮助。

Unexpected behaviour of Process.MainWindowHandle

Getting MainWindowHandle of a process in C#

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

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    这里的主要问题是您基本上对您正在启动的程序一无所知,只知道它与 .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()前一个对象,因此删除该行。

    【讨论】:

    • 我尝试了您的解决方案,但总是出现异常:“System.InvalidOperationException”:没有进程与此对象关联。
    • 在哪里?什么线?第一次执行还是后续执行?
    • 我第二次在 "this.previousProcess.HasExited" 处运行该部分(所以当 previousProcess != null 时)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    相关资源
    最近更新 更多