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()); } } }