Files

49 lines
1.8 KiB
C#
Raw Permalink Normal View History

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