Сбой комплекта сертификации приложений для Windows: тест многопользовательского сеанса

Я пытаюсь загрузить приложение WinForms через комплект сертификации приложений Windows и терплю неудачу в этом тесте:

  <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) Смогу ли я зарегистрировать один и тот же хоткей в разных пользовательских сессиях? Или я должен как-то отменить и перерегистрировать горячую клавишу при переключении пользовательских сессий?

ТИА


person Dan Byström    schedule 18.03.2014    source источник
comment
Я думаю, что использование мьютекса - лучший способ предотвратить несколько экземпляров.   -  person Anthony Russell    schedule 18.03.2014


Ответы (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();
    }
}
person Mitch    schedule 18.03.2014