2013-03-03 62 views
1

我创建的应用程序包含通知图标,并且它在后台保持活动状态(以及某种方式)。问题是,当用户点击我的应用程序的图标时,应用程序将再次启动,所以我有两个通知图标和两个活动在后台和两个一切。如果用户再次点击该图标,则会出现三种情况,......因此,我应该停止此操作。我有一种设置标志并将其值设置为注册表的想法,当我的应用程序想要启动时,在表单加载事件中,通过读取值终止应用程序。但我想要一个更专业的方式来处理它。例如根本不开始。如何防止我的应用程序一次又一次启动

回答

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; 
    } 
} 
+0

你看,我说的是点击应用程序本身(不是它的通知图标)带来这种情况。我的意思是当点击我的app.exe文件时,会出现此问题。 – roostaamir 2013-03-03 14:17:59

+0

我看到他说什么时候点击图标,他正在谈论实际的桌面图标。不知道我的代码是否在任何地方挂起。如果我找不到它,我会删除它。 – 2013-03-03 14:18:44

1

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

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

UnauthorizedAccessException on Openexisting global mutex

+0

请你在你说的有点业余的方式说话?!也许一个代码示例什么?因为这是有点我的第一个真正的应用程序!感谢 – roostaamir 2013-03-03 14:13:27

+0

只是要清楚,你的时候启动一个exe的新实例,它将在一个不同的STA中打开。他们不共享变量,所以你不能使用互斥或​​事件,因为它们不共享。我错了吗? – 2013-03-03 14:29:48

+1

GLOBAL \ Mutex在整个Windows计算机上都可见。如果您希望能够连接到它们,您将需要授予权限,但如果它们存在并且您没有权限,则会提供例外。 – 2013-03-03 14:37:40

相关问题