質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WinUI3

WinUI3は、Windowsデスクトップアプリ開発向けのネイティブUIフレームワークのバージョン3です。Windows10以降で採用されたFluentデザインに対応。直観的で使いやすい機能を備えています。

Q&A

解決済

1回答

1408閲覧

WinUI3の二重起動を禁止

junyasu0124

総合スコア38

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WinUI3

WinUI3は、Windowsデスクトップアプリ開発向けのネイティブUIフレームワークのバージョン3です。Windows10以降で採用されたFluentデザインに対応。直観的で使いやすい機能を備えています。

1グッド

0クリップ

投稿2023/03/25 03:17

編集2023/03/25 03:19

実現したいこと

WinUI3のアプリを作っています。データの扱いが難しくなるので二重起動ができないようにしたいです。さらに二重起動している場合は既にあるアプリのウィンドウがアクティブ化されるような動作にしたいです。

試したこと

「Mutex」を使うとすでに起動しているかはわかるようなのですが、二重起動しているとわかったときにすでに起動しているウィンドウがアクティブ化されるようにするプログラムがわかりません。

補足情報

App.xaml.csの下の部分に何かを入れるのかなと思いますが

C#

1protected override void OnLaunched(LaunchActivatedEventArgs args) 2{ 3 Microsoft.UI.Xaml.Window m_window = new MainWindow(); 4 m_window.Activate(); 5}
TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2023/03/25 03:37

二重起動禁止は実装できている、ということでしょうか。
Zuishin

2023/03/25 05:54

ミューテックスを調べるとこの質問の意味がわかると思います。
Zuishin

2023/03/25 06:01 編集

戦略としては、後から起動した方が既に起動されていることを認識し、プロセス間通信を行って二重起動されたことを先に起動された方に伝え、それを受けて自分自身をアクティブにするという手順が一般的です。 プロセス間通信の方法はいくつかありますが、IPC チャネルが手軽です。 これを使えば先に起動されていることもわかるので、ミューテックスは不要です。
guest

回答1

0

ベストアンサー

WinUI3のアプリを作っています。データの扱いが難しくなるので二重起動ができないようにしたいです。

こちらに2つの方法での解説があります。回答では簡単な方(OnLaunched)でやりました。
アプリケーション ライフサイクル機能の移行 - Windows apps | Microsoft Learn

さらに二重起動している場合は既にあるアプリのウィンドウがアクティブ化されるような動作にしたい

上の例はアクティブ化まではされない中途半端な例でして、AppInstance.ActivatedWindow.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

投稿2023/03/25 06:50

TN8001

総合スコア9321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

junyasu0124

2023/03/25 09:08

回答ありがとうございます。上のプログラムを少し変えたものを使うことにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問