Сбой комплекта сертификации приложений Windows: тестирование многопользовательского сеанса
Я пытаюсь получить приложение WinForms через Windows App Certification Kit, и в этом тесте происходит сбой:
<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) Смогу ли я зарегистрировать одну и ту же горячую клавишу в разных пользовательских сессиях? Или я должен как-то отменить регистрацию и перерегистрировать горячую клавишу при переключении пользовательских сеансов?
ТИА
1 ответ
Вы можете достичь того же эффекта, используя 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();
}
}