如何将应用最大化到系统托盘?

7
我写了一个小的WPF应用程序,当“关闭”时它最小化到系统托盘(客户要求)。双击弹出,右键点击可退出。但是,如果应用程序被最小化,并且用户导航到开始->所有程序->该应用程序,则会启动一个新实例。在C#中,我需要做什么来使应用程序最大化运行实例,而不是启动新实例?谢谢!

2
查找 Mutex 对象并抓取活动窗口。我手头没有代码,但这是你需要采取的方向。——我撒谎了,请尝试阅读此文章:.NET 应用程序单实例(http://www.ai.uga.edu/mc/SingleInstance.html)。 - Brad Christie
@Nicros,嘿,你有解决这个问题的办法吗? - raghava arr
1个回答

7

这篇Jon Skeet的回答讨论了使用互斥锁的方法。

互斥锁是可行的方式。它比使用进程名称等方式更加稳定。

然而,你需要确保互斥锁不会被垃圾回收。对于一个服务(它是事件驱动的,而不是具有“main”方法的应用程序),最明智的做法可能是将它放在静态变量中。

当服务停止时,请处理互斥锁,这样你就不需要等待最终化或类似的操作。

Matthew Brindley在同一个问题中提供了他的回答示例。

[STAThread]
static void Main() 
{
   using(Mutex mutex = new Mutex(false, "Global\\" + appGuid))
   {
      if(!mutex.WaitOne(0, false))
      {
         MessageBox.Show("Instance already running");
         return;
      }

      Application.Run(new Form1());
   }
}

为了最大化其他应用程序,您需要发送最大化消息。请参阅此文章message sending以了解更多信息。

不得不收回我的“完美!”的说法——这个检查实例是否正在运行,但并不回答如何在不启动新实例的情况下最大化这个系统托盘应用程序的问题。 - Nicros
啪嗒声。让我撤回我的撤回——错过了底部的信息链接,会去查看它。 - Nicros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接