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