【问题标题】:How do I prevent my app from launching over and over again [duplicate]如何防止我的应用程序一遍又一遍地启动[重复]
【发布时间】:2013-03-03 14:02:18
【问题描述】:

我正在创建的应用程序包含一个通知图标,并且它在后台保持活跃(嗯,有点)。问题是当用户点击我的应用程序的图标时,应用程序将再次启动,所以我有两个通知图标和两个后台活动以及两个所有内容。如果用户再次单击该图标,将出现所有这些内容中的三个......所以我应该以某种方式阻止它。我有一种设置标志并将其值设置为注册表的想法,当我的应用程序想要启动时,在表单加载事件中,通过读取值来终止应用程序。但我想要一种更……专业的方式来处理它。例如根本没有启动。

【问题讨论】:

    标签: c# notifyicon


    【解决方案1】:

    这是来自this 的答案,它是this 的一个副本。您在应用的入口构造函数中检查应用是否已经在运行。

    static void Main() 
    {
        Process currentProcess = Process.GetCurrentProcess();
        var runningProcess = (from process in Process.GetProcesses()
                              where
                                process.Id != currentProcess.Id &&
                                process.ProcessName.Equals(
                                  currentProcess.ProcessName,
                                  StringComparison.Ordinal)
                              select process).FirstOrDefault();
        if (runningProcess != null)
        {
            ShowWindow(runningProcess.MainWindowHandle, SW_SHOWMAXIMIZED);
           return; 
        }
    }
    

    【讨论】:

    • 你看,我说的是点击应用程序本身(不是它的通知图标)会带来这种情况。我的意思是当点击我的app.exe文件时,就会出现这个问题。
    • 我看到当他说单击图标时,他指的是实际的桌面图标。不确定我是否有该代码挂在任何地方。如果找不到,我会删除它。
    【解决方案2】:

    创建您的应用创建的某种形式的全局互斥/事件句柄,然后在打开的例程中检查它是否存在,如果存在,则退出启动路由。

    在我给出的这个答案中,我有一些基本代码(针对不同的问题),但它展示了您正在尝试做的事情。

    UnauthorizedAccessException on Openexisting global mutex

    【讨论】:

    • 能否请您以一种有点业余的方式交谈?!也许有代码示例或其他东西?因为这有点像我的第一个真正的应用程序!谢谢
    • 需要明确的是,当您启动一个新的 exe 实例时,它会在不同的 STA 中打开。它们不共享变量,因此您不能使用互斥锁或事件,因为它们不是共享的。我弄错了吗?
    • GLOBAL\Mutex 在整个 Windows 机器上都是可见的。如果您希望能够附加到它们,您将需要授予权限,但如果它们存在并且您没有权限,它们会给出例外。
    • 感谢您提供额外信息。 stackoverflow.com/questions/229565/… 看起来像是一个很好的 SO 帖子,有一个实现。
    猜你喜欢
    • 2021-05-30
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2017-11-13
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多