Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单击按钮时如何检查已打开的窗口?_C#_Winforms_Visual Studio_Process - Fatal编程技术网

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

C# 单击按钮时如何检查已打开的窗口?,c#,winforms,visual-studio,process,C#,Winforms,Visual Studio,Process,我在Windows7(32位)中的VisualStudio2008WinForms应用程序项目中工作。我在C#中做这个项目。 我在选项卡中放置了一些按钮,并在单击后添加了相应的操作。单击按钮时,我只是在其操作部分运行一个.exe文件。 我的问题是,我通过单击一个按钮打开了一个窗口(因此.exe文件正在运行),现在,当我再次单击该按钮时,它将再次打开同一个窗口,而不管是否已打开。我想解决这个问题,因为当一个窗口被打开时,它不能在另一次点击同一个按钮时再次打开。如何解决这个问题? 请帮忙。。。。 提

我在Windows7(32位)中的VisualStudio2008WinForms应用程序项目中工作。我在C#中做这个项目。 我在选项卡中放置了一些按钮,并在单击后添加了相应的操作。单击按钮时,我只是在其操作部分运行一个.exe文件。 我的问题是,我通过单击一个按钮打开了一个窗口(因此.exe文件正在运行),现在,当我再次单击该按钮时,它将再次打开同一个窗口,而不管是否已打开。我想解决这个问题,因为当一个窗口被打开时,它不能在另一次点击同一个按钮时再次打开。如何解决这个问题? 请帮忙。。。。
提前感谢。

重新单击按钮时,您可以检查流程是否已在运行:

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
   }
}

重新单击按钮时,可以检查流程是否已在运行:

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
   }
}

如果知道启动的进程的名称或运行.exe的路径,则可以使用
进程
类检查它当前是否正在运行。

如果知道启动的进程的名称或运行.exe的路径,可以使用
进程
类检查它当前是否正在运行。
正确的答案是,除非两个应用程序共享一个公共资源,或者可以通过某个渠道相互通信,否则没有安全有效的方法来实现您想要的。由于该进程是外部的,因此它可能在您的呼叫应用程序启动之前已经运行,甚至在它已经运行时也可能已经运行。您将无法判断流程是否已从您的应用程序启动

在我写这篇文章的时候,你的问题还没有说明你是否有权修改你正在调用的外部应用程序。但是,如果您是,使用a将是一种快速而简单的方法来解决您的问题

在您的外部应用程序中,每当您想让另一个应用程序知道您想要的任何条件(无论是进程正在运行还是特定窗口已打开)时,请创建一个
互斥锁
实例,如下所示:

var mutex = new Threading.Mutex(true, "mutex unique identifier");
在您的呼叫应用程序中,尝试创建一个具有相同标识符的
互斥体
实例:

bool alreadyExists;
var mutex = new Threading.Mutex(false, "mutex unique identifier", out alreadyExists);
这里的
alreadyExists
变量将告诉您外部进程是否正在运行。这比试图通过其名称识别它要安全得多,因为其他进程可能具有相同的名称,或者新版本可能具有不同的名称。当然,互斥体标识符必须尽可能唯一(如
Guid
),否则可能会遇到相同的问题

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

mutex.ReleaseMutex();
注意,如果进程结束,互斥锁将由操作系统自动释放


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

这里的正确答案是,除非两个应用程序共享一个公共资源或可以通过某种渠道相互通信,否则没有安全有效的方法来实现您想要的。由于该进程是外部的,因此它可能在您的呼叫应用程序启动之前已经运行,甚至在它已经运行时也可能已经运行。您将无法判断流程是否已从您的应用程序启动

在我写这篇文章的时候,你的问题还没有说明你是否有权修改你正在调用的外部应用程序。但是,如果您是,使用a将是一种快速而简单的方法来解决您的问题

在您的外部应用程序中,每当您想让另一个应用程序知道您想要的任何条件(无论是进程正在运行还是特定窗口已打开)时,请创建一个
互斥锁
实例,如下所示:

var mutex = new Threading.Mutex(true, "mutex unique identifier");
在您的呼叫应用程序中,尝试创建一个具有相同标识符的
互斥体
实例:

bool alreadyExists;
var mutex = new Threading.Mutex(false, "mutex unique identifier", out alreadyExists);
这里的
alreadyExists
变量将告诉您外部进程是否正在运行。这比试图通过其名称识别它要安全得多,因为其他进程可能具有相同的名称,或者新版本可能具有不同的名称。当然,互斥体标识符必须尽可能唯一(如
Guid
),否则可能会遇到相同的问题

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

mutex.ReleaseMutex();
注意,如果进程结束,互斥锁将由操作系统自动释放

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

您可以尝试以下操作:

    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;
    }
您可以尝试以下方法:

    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;
    }

谢谢你的支持。。我得到的答案是这样的

1) 为函数中的进程创建事件“退出”按钮单击 2) 为设置标志的退出事件定义函数 3) 每次在功能按钮中打开流程时,检查标志是否已设置。单击

退出事件:“p”是进程的名称: p、 已退出+=新的事件处理程序(p_已退出)

p_Exited将是我们将在其中设置标志的函数名


谢谢大家……

谢谢大家的支持。。我得到的答案是这样的

1) 为函数中的进程创建事件“退出”按钮单击 2) 为设置标志的退出事件定义函数 3) 每次在功能按钮中打开流程时,检查标志是否已设置。单击

退出事件:“p”是进程的名称: p、 已退出+=新的事件处理程序(p_已退出)

p_Exited将是我们将在其中设置标志的函数名


谢谢大家…

欢迎收看StackOverflow。您正在运行的是您自己的可执行文件还是其他人的可执行文件?你试过什么吗?如果是,你试过什么?您是否需要在exe运行时单击其他按钮,或者整个应用程序将失去响应?请参阅,我建议使用Jon的按钮answer@JBurnham:我认为这是可执行文件的窗口,而不是他的o