如何在单击按钮时检查已打开的窗口?

时间:2014-03-12 14:09:47

标签: c# winforms visual-studio process

我正在使用Windows 7中的Visual Studio 2008 Winforms应用程序项目(32位)。我正在使用C#进行项目。 我在选项卡中放置了一些按钮,并在单击它时为其添加了操作。单击按钮时,只是在其操作部分中运行.exe文件。 我的问题是,我通过单击一个按钮打开一个窗口(所以.exe文件正在运行),现在当我再次单击该按钮时,它再次打开同一个窗口,而不管它是否打开。我想解决这个问题,因为当打开一个窗口时,不能再次点击同一个按钮打开它。如何解决这个问题。 ? 请帮忙.... 提前谢谢..

5 个答案:

答案 0 :(得分:0)

您可以在重新点击按钮时检查进程是否已在运行:

private void btnStartExecutable_Click(object sender, EventArgs e)
{
   Process[] processName = Process.GetProcessesByName("InsertProcessNameHere");
   if (pname.Length == 0)
   {
       MessageBox.Show("Application isn't running yet.");
       //Start application here
       Process.Start("InsertProcessNameHere");
   }
   else
   {
       MessageBox.Show("Application is already running.");
       //Don't start application, since it has been started already
   }
}

答案 1 :(得分:0)

正确答案恕我直言,除非两个应用程序共享一个公共资源或通过某个渠道相互通信,否则没有安全高效方式实现你想要的。由于该过程是外部的,因此它可能已经在您的调用应用程序启动之前运行,或者甚至在它已经运行时。您无法判断该流程是否已从您的应用中启动。

当我写这个时,你的问题还没有说明你是否可以自由修改你正在呼叫的外部应用程序。但是,如果您使用Mutex,则可以快速轻松地解决问题。

在您的外部应用程序中,只要您想让其他应用程序知道您想要的任何条件(无论是进程正在运行还是打开特定窗口),都要创建一个Mutex实例,如下所示: :

var mutex = new Threading.Mutex(true, "mutex unique identifier");

在您的调用应用中,尝试使用相同的标识符创建Mutex实例:

bool alreadyExists;
var mutex = new Threading.Mutex(false, "mutex unique identifier", out alreadyExists);

此处alreadyExists变量将告诉您外部进程是否正在运行。这比通过其名称尝试识别它更安全,因为其他进程可能具有相同或新版本可能具有不同的名称。当然,互斥锁标识符必须尽可能唯一(如Guid),否则您可能会遇到同样的问题。 ;)

每当您觉得必须释放互斥锁时(在外部应用程序级别),请释放它:

mutex.ReleaseMutex();

请注意,如果进程结束,操作系统将自动释放互斥锁。

如果外部应用程序不是基于.NET的应用程序,您仍然可以使用Win32 API函数创建互斥锁。

答案 2 :(得分:0)

你可以试试这个:

    bool processExited = true;
    private void button1_Click(object sender, EventArgs e)
    {
        if (processExited)
        {

            Process process = new Process();
            process.EnableRaisingEvents = true;
            process.Exited += MyProcessExited;
            process.StartInfo = new ProcessStartInfo();
            process.StartInfo.FileName = "notepad.exe";
            process.Start();
            processExited = false;
        }
        else
        {
            MessageBox.Show("Still running");
        }

    }

    void MyProcessExited(object sender, EventArgs e)
    {
        processExited = true;
    }

答案 3 :(得分:0)

感谢您的支持..我得到了这样的答案..

1)在功能按钮点击中为进程创建一个event'Exit' 2)为设置标志的退出事件定义一个函数 3)在功能按钮单击

中打开过程时,每次检查标志是否设置

退出事件:'P'是流程的名称: p.Exited + = new EventHandler(p_Exited);

p_Exited将是我们将设置标志的函数名称。

谢谢大家......

答案 4 :(得分:-2)

如果您知道启动进程的名称或运行.exe的路径,则可以使用Process类检查它当前是否正在运行。 http://msdn.microsoft.com/en-us/library/system.diagnostics.process(v=vs.110).aspx