WinUI3のアプリを作っています。データの扱いが難しくなるので二重起動ができないようにしたいです。
こちらに2つの方法での解説があります。回答では簡単な方(OnLaunched
)でやりました。
アプリケーション ライフサイクル機能の移行 - Windows apps | Microsoft Learn
さらに二重起動している場合は既にあるアプリのウィンドウがアクティブ化されるような動作にしたい
上の例はアクティブ化まではされない中途半端な例でして、AppInstance.ActivatedでWindow.Activateを呼べば良いようです。
ただし(現時点では)Activate
は最小化の復帰はしますが前面には持ってきてくれないようなので、自分でSetForegroundWindow
しますorz
Window.Activate does not activate and bring window to foreground in WinUI3 if window is in background but not minimized · Issue #7595 · microsoft/microsoft-ui-xaml
cs
1using System;
2using System.Diagnostics;
3using System.Runtime.InteropServices;
4using Microsoft.UI.Dispatching;
5using Microsoft.UI.Xaml;
6using Microsoft.Windows.AppLifecycle;
7using WinRT.Interop;
8
9
10namespace Q50c23hf10ti23c;
11
12public partial class App : Application
13{
14 private Window m_window;
15
16 public App() => InitializeComponent();
17
18 protected override async void OnLaunched(LaunchActivatedEventArgs args)
19 {
20 var mainInstance = AppInstance.FindOrRegisterForKey("main");
21 if (!mainInstance.IsCurrent)
22 {
23 var activatedEventArgs = AppInstance.GetCurrent().GetActivatedEventArgs();
24 await mainInstance.RedirectActivationToAsync(activatedEventArgs);
25
26 Process.GetCurrentProcess().Kill();
27 return;
28 }
29
30 m_window = new MainWindow();
31 m_window.Activate();
32
33 mainInstance.Activated += MainInstance_Activated;
34 }
35
36 private void MainInstance_Activated(object sender, AppActivationArguments e)
37 {
38 m_window.DispatcherQueue.TryEnqueue(DispatcherQueuePriority.Normal, () =>
39 {
40 m_window.Activate();
41 SetForegroundWindow(WindowNative.GetWindowHandle(m_window));
42 });
43 }
44
45 [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
46 [DefaultDllImportSearchPaths(DllImportSearchPath.System32)]
47 [return: MarshalAs(UnmanagedType.Bool)]
48 private static extern bool SetForegroundWindow(nint hWnd);
49}
WinUI3はまだいろいろ足りなかったりちょこちょこ変更されたりと動きが激しいので、関連リポのウォッチは必須です。
Issues · microsoft/WindowsAppSDK
Issues · microsoft/microsoft-ui-xaml
Issues · CommunityToolkit/WindowsCommunityToolkit