代码之家  ›  专栏  ›  技术社区  ›  Lloyd Powell binku

限制应用程序的多个实例

  •  12
  • Lloyd Powell binku  · 技术社区  · 15 年前

    好吧,我已经创建了我的C应用程序,为它创建了一个安装程序,并在我的机器上安装了它。

    问题是,当用户打开应用程序exe两次时,将有两个应用程序实例正在运行。我只希望在任何时候运行应用程序的一个实例,我该怎么做呢?

    谢谢你的帮助,

    5 回复  |  直到 8 年前
        1
  •  9
  •   Anton Gogolev    8 年前

    通常的方法是创建一个 Mutex 并在应用程序启动时检查其是否存在。

    this this .

    DDJ代码:

    class App : Form
    {
        Mutex mutex;
    
        App()
        {
            Text = "Single Instance!";
            mutex = new Mutex(false, "SINGLE_INSTANCE_MUTEX");
            if (!mutex.WaitOne(0, false)) 
            {
                mutex.Close();
                mutex = null;
            }
        }
    
        protected override void Dispose(bool disposing)
        {
            if (disposing)
                mutex.ReleaseMutex();
            base.Dispose(disposing);
        }
    
        static void Main()
        {
            App app = new App();
            if (app.mutex != null) Application.Run(app);
            else MessageBox.Show("Instance already running");
        }
    }
    
        2
  •  8
  •   nWorx    15 年前

    我用这个解决了这个问题

    [STAThread]
     static void Main()
        {
    
            Process[] result = Process.GetProcessesByName("ApplicationName");
            if (result.Length > 1)
            {
                MessageBox.Show("There is already a instance running.", "Information");
                System.Environment.Exit(0);
            }
            // here normal start 
        }
    

    这很简单,但我几乎没有时间去寻找更好的解决方案。

        3
  •  4
  •   lance    15 年前

    感谢 Messrs. Allen Powell :

        static void Main() 
        {
            using (Mutex mutex = new Mutex(false, @"Global\" + appGuid)) {
                if (!mutex.WaitOne(0, false)) {
                    string processName = GetProcessName();
                    BringOldInstanceToFront(processName);
                }
                else {
                    GC.Collect();
                    Application.Run(new Voting());
                }
            }
        }
    
        private static void BringOldInstanceToFront(string processName) {
            Process[] RunningProcesses = Process.GetProcessesByName(processName);
            if (RunningProcesses.Length > 0) {
                Process runningProcess = RunningProcesses[0];
                if (runningProcess != null) {
                    IntPtr mainWindowHandle = runningProcess.MainWindowHandle;
                    NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_SHOWMINIMIZED);
                NativeMethods.ShowWindowAsync(mainWindowHandle, (int) WindowConstants.ShowWindowConstants.SW_RESTORE);
                }
            }
        }
    
        5
  •  0
  •   ckittel evasilchenko    15 年前

    我不知道您所处的环境,但要记住的是“单实例应用程序”是如何定义单实例的。如果应用程序可以同时在多个工作站上运行,使用一个公共数据源,这是一个问题吗?同样,如果一个终端服务情况(或“运行方式”情况)有多个用户登录到同一台计算机,您希望以这样一种方式限制应用程序:每个用户、每台计算机只有一个实例?或者,您只需要为每个用户提供一个实例就可以了吗?

    这些问题的答案可能会引导你朝着一个方向而不是另一个方向前进。例如,我们有一个“单实例”应用程序,其作用域是一组计算机。在该工作站组中只允许一个用户登录。我们通过在共享数据源中有一个跟踪当前连接的用户的表来管理这一点。这是一个维护问题,因为您需要确保表始终100%准确。处理诸如工作站意外断电之类的事情,在那个表中留下“伪造”的记录,需要谨慎处理。