Обнаружение запуска приложения Centennial для предотвращения нескольких экземпляров - PullRequest
1 голос
/ 04 июля 2019

Предотвратить несколько экземпляров приложений WPF или WinForms непросто. Тем не менее, приложения UWP, естественно, единичны. Поскольку каждое приложение Centennial ("Desktop Bridge") запускается как приложение UWP изнутри, должен быть какой-то способ обнаружить запуск по некоторому центральному событию и просто установить какой-либо флаг, а также предотвратить открытие приложения, если этот флаг установлен .

Я, однако, не смог найти способ сделать это. Есть ли способ?

1 Ответ

2 голосов
/ 05 июля 2019

Есть ли способ?

К сожалению, нет. Действительно, существует FindOrRegisterInstanceForKey API, который позволяет регистрировать и извлекать конкретный экземпляр приложения с помощью ключа, но он не поддерживается в упакованных настольных приложениях.

Вы должны будете реализовать эту функцию самостоятельно, например, используя Mutex. Просто запретить запуск нескольких экземпляров должно быть довольно просто. В упакованном приложении WPF вы должны изменить свойство Build Action файла App.xaml с ApplicationDefinition на Page, чтобы компилятор не генерировал для вас метод Main по умолчанию, и написать его самостоятельно:

class Program
{
    const string AppUniqueGuid = "9da112cb-a929-4c50-be53-79f31b2135ca";

    [STAThread]
    static void Main(string[] args)
    {
        using (System.Threading.Mutex mutex
            = new System.Threading.Mutex(false, AppUniqueGuid))
        {
            if (mutex.WaitOne(0, false))
            {
                App application = new App();
                application.InitializeComponent();
                application.Run();
            }
            else
            {
                MessageBox.Show("Instance already running!");
            }
        }
    }
}
...