停止启动Windows应用程序的多个实例的最佳方法是什么?

时间:2010-06-10 09:59:15

标签: windows

许多Windows应用程序(例如Skype或MSN)不允许您启动多个实例,而是尝试第二次运行它只是让现有版本继续运行。

这通常是以一种简单的方式完成的 - 开始菜单快捷方式是主应用程序周围的“包装”应用程序 - 或者您是否可以使用一些注册表魔法将问题委托给Windows本身?

特别是在这里处理Win32(非托管C ++),但很高兴听到更多通用解决方案,只要它们可以在Windows XP或更高版本上运行。

编辑:this似乎是最好的重复。

3 个答案:

答案 0 :(得分:0)

据我记忆,存在系统范围的互斥锁。首次启动时设置Mutex,如果已经设置,则立即退出。

使用CreateMutex()调用一个名为“Global \”的名称应该是技巧。

答案 1 :(得分:0)

  1. 命名为Mutex或类似的OS-specfic命名对象。如果它存在 - 应用程序正在运行。
  2. 在某处锁定文件(在临时目录中等 - 在程序启动时创建它,在程序结束时删除)。 Linux软件经常以这种方式运行(某些程序将PID存储在lockfile中),但它不安全 - 如果你突然断电(断电),锁定文件可能不会被删除。
  3. 您可以随时枚举所有正在运行的流程并尝试找到自己。

可能有更多方法可以做到,但这些是我能想到的第一个。

答案 2 :(得分:0)

我只是检查进程是否已经运行:如果它没有启动应用程序,如果它已经运行,则将窗口置于前台。检查在Main方法中完成。

我使用System.Diagnostics.Process.GetCurrentProcess().ProcessName获取流程名称,并检查它是否已在运行System.Diagnostics.Process.GetProcessesByName()。如果有多个进程聚焦第一个进程然后退出。