我试图通过Windows应用认证套件提取WinForms应用程序并在此测试中失败:
<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;
}
这是一个由热键组合激活的托盘应用程序,已在此功能中注册:
[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
答案 0 :(得分:2)
使用Mutex
可以达到相同的效果。有关详细信息,请参阅MSDN,但简短版本是使用以"Local\"
开头的名称创建的任何互斥锁都将是每个会话。输入名为"Local\MyAppName"
的互斥锁,每个会话只能运行一个应用实例。
热键是按会话注册的,在多个会话中注册相同的热键不会有问题。
使用示例(来自Run single instance of an application using 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();
}
}