Windows应用程序authentication套件失败:多用户会话testing

我试图通过Windows应用程序authentication套件拉一个WinForms应用程序,并在这个testing失败:

<TEST INDEX="17" NAME="Multi user session test" DESCRIPTION="Multi User checks Application invocation in multiple sessions." EXECUTIONTIME="00h:00m:24s.22ms"> <RESULT><![CDATA[FAIL]]></RESULT> <MESSAGES /> 

我想这是因为我只允许应用程序的一个实例运行,如下所示:

 using ( var p = System.Diagnostics.Process.GetCurrentProcess() ) if ( System.Diagnostics.Process.GetProcessesByName( p.ProcessName ).Length > 1 ) { MessageBox.Show( "An instance of xxx is already running!", Title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation ); return; } 

这是一个由热键组合激活的托盘应用程序,使用此function注册:

 [DllImport( "user32", EntryPoint = "RegisterHotKey", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true )] public static extern int RegisterHotkey( IntPtr hWnd, int id, int fsModifiers, int vk ); 

所以我想我有两个问题:

1)如何正确地阻止在同一用户会话中运行多个会话,但允许多个用户会话中的多个实例?

2)我能否在不同的用户会话中注册相同的热键? 或者当用户会话切换时,我必须以某种方式取消注册并重新注册热键?

TIA

    你可以使用Mutex来达到同样的效果。 有关详细信息,请参阅MSDN,但简短版本是任何以"Local\"开头的名称的互斥将按会话进行。 输入一个名为"Local\MyAppName"的互斥体,并且每个会话只能运行一个应用程序实例。

    热键是按会话注册的,在多个会话中注册相同的热键不会有问题。

    示例使用(从运行使用Mutex的应用程序的单个实例 ):

     bool ownsMutex = false; // NOTE: Local is the default namespace, so the name could be shortened to myApp Mutex myMutex = new Mutex(false, @"Local\myApp"); try { ownsMutex = myMutex.WaitOne(0) } catch (AbandonedMutexException) { ownsMutex = true; } if (!ownsMutex) { MessageBox.Show("myApp is already running!", "Multiple Instances"); return; } else { try { Application.Run(new Form1()); } finally { myMutex.ReleaseMutex(); } }