49 lines
1.8 KiB
C#
49 lines
1.8 KiB
C#
using Microsoft.UI.Dispatching;
|
|
using Microsoft.UI.Xaml;
|
|
using Microsoft.Windows.AppLifecycle;
|
|
using System;
|
|
using System.Threading;
|
|
|
|
namespace HearingProtector;
|
|
|
|
public static class Program
|
|
{
|
|
[STAThread]
|
|
static void Main(string[] ___)
|
|
{
|
|
var mainInstance = AppInstance.FindOrRegisterForKey("HearingProtector_Main");
|
|
|
|
if (!mainInstance.IsCurrent)
|
|
{
|
|
// Мы не первый экземпляр — просим основной обработать активацию и выходим.
|
|
var activationArgs = AppInstance.GetCurrent().GetActivatedEventArgs();
|
|
mainInstance.RedirectActivationToAsync(activationArgs).AsTask().Wait();
|
|
return;
|
|
}
|
|
|
|
// Подписываемся на активации от будущих попыток запуска.
|
|
mainInstance.Activated += OnInstanceActivated;
|
|
|
|
// Стандартный запуск WinUI с правильным SynchronizationContext.
|
|
Application.Start(__ =>
|
|
{
|
|
var context = new DispatcherQueueSynchronizationContext(
|
|
DispatcherQueue.GetForCurrentThread());
|
|
SynchronizationContext.SetSynchronizationContext(context);
|
|
_ = new App();
|
|
});
|
|
}
|
|
|
|
// Срабатывает, когда кто-то пытается запустить второй экземпляр.
|
|
private static void OnInstanceActivated(object? sender, AppActivationArguments e)
|
|
{
|
|
// ВАЖНО: событие приходит из НЕ-UI потока, поэтому нужно маршалить.
|
|
var app = App.CurrentApp;
|
|
var window = app?.MainWindow;
|
|
|
|
if (window is MainWindow mw)
|
|
{
|
|
window.DispatcherQueue.TryEnqueue(() => mw.RestoreFromTray());
|
|
}
|
|
}
|
|
} |