c#显示进程的隐藏窗口
本文关键字:隐藏 窗口 进程 显示 | 更新日期: 2023-09-27 18:18:32
在我的应用程序中有一个选项来隐藏窗口- form.hide(),并在系统托盘中放置一个通知图标,当你点击通知图标时,会有一个form.show()。
如果有人试图运行两个实例的应用程序,我想A.不运行新实例B.显示第一个实例的窗口
我已经有一个循环来检查是否存在具有相同名称的进程。我可以告诉新的应用程序不运行(返回在program.cs之前Application.run(new form())
)
但是我必须告诉第一个应用程序显示它的主窗口。
我有进程(第一个实例),我可以得到它的句柄,它的id等。
这个问题如何显示窗口使用它的进程?
对于问题的第一部分,您可以这样做。在显示表单之前将其添加到Main
中。这样做的好处是,您不需要根据进程名(可能不是唯一的)进行检查,而是创建了一个"全局"互斥锁。
using (Mutex applicationMutex = new Mutex(true, "SomeRandomTextHere", out mutexCreated))
{
if (!mutexCreated)
{
// Application is already running. Aborting..
return;
}
// Application.Run(..) goes here, plus other interesting stuff
}
对于你问题的第二部分,我建议如下:
- 创建一个命名事件,并将其初始值设置为false。然后在应用程序中创建一个监视此事件的工作线程。当它发出信号时,从主窗体调用
Show
方法。 - 另一种方法是搜索主进程的窗口句柄并将其放在前面。这篇文章可以给你一些想法。
请记住,在所有进程中执行循环不如使用互斥锁有效。如果你不关心速度,干净的代码,你只是想让这个应用程序工作,那么使用这个循环。对我来说,代码就是诗歌。
为您重写了代码,这将完全满足您的需求。它将检查副本,并在打开副本时聚焦屏幕。
EventWaitHandle ProgramOpen = new EventWaitHandle(false, EventResetMode.ManualReset, "ProgramOpen198472");
EventWaitHandle FocusProgram = new EventWaitHandle(false, EventResetMode.ManualReset, "FocusMyProgram198472");
private delegate void focusConfirmed(); Thread FocusCheck;
private void focus() { FocusProgram.WaitOne(); this.Invoke(new focusConfirmed(()=>{this.Show(); this.BringToFront();}));}
private void Form1_Load(object sender, EventArgs e)
{
if (ProgramOpen.WaitOne(0))
{
FocusProgram.Set();
this.Close();
}
ProgramOpen.Set();
}
private void HideButton_Click(object sender, EventArgs e)
{
this.Hide();
FocusProgram.Reset();
FocusCheck = new Thread(focus);
FocusCheck.Start();
}
private void showToolStripMenuItem_Click(object sender, EventArgs e)
{
FocusProgram.Set();
}