我的应用程序中有一个选项可以隐藏窗口 - form.hide(),并在系统托盘中放置一个notifyicon,当您点击notifyicon时,会有一个表单。显示()。
如果有人会尝试运行该应用的两个实例,我想要 一个。不要运行新实例 湾显示第一个实例的窗口
我已经有一个循环来检查是否存在具有相同名称的进程。
我可以告诉新的应用程序不要运行(返回在Application.run(new form())
之前的program.cs中)
但我必须告诉第一个应用程序显示其主窗口。
我有进程(第一个实例),我可以得到它的id等等。
问题 如何使用它的过程显示窗口?答案 0 :(得分:0)
对于问题的第一部分,这是你可以做的。在显示表单之前在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
}
对于问题的第二部分,我建议如下:
Show
方法。请记住,在所有进程中执行循环不如使用互斥锁有效。如果你不关心速度,清理代码,你只是希望这个应用程序工作,然后使用这个循环..对我来说代码是诗歌。
答案 1 :(得分:0)
仅为您重新编写代码,这将为您提供您想要的内容。它将检查重复项并在打开副本时聚焦屏幕。
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();
}