自作パッケージアプリをURI起動させる

もくじ
https://tera1707.com/entry/2022/02/06/144447

やりたいこと

パッケージアプリにはURI起動という方法で、アプリを起動できるらしい。

やり方調べてみる。

やったこと

Package.appxmanifestファイルを開いて、<Extensions>に、<uap:Extension Category="windows.protocol">を追加する。

具体的には、下記のようにする。

<Applications>
  <Application Id="App"
    Executable="$targetnametoken$.exe"
    EntryPoint="$targetentrypoint$">
    <uap:VisualElements
      DisplayName="WindowMessageSender (Package)"
      Description="WindowMessageSender (Package)"
      BackgroundColor="transparent"
      Square150x150Logo="Images\Square150x150Logo.png"
      Square44x44Logo="Images\Square44x44Logo.png">
      <uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" />
      <uap:SplashScreen Image="Images\SplashScreen.png" />
    </uap:VisualElements>

    <Extensions>
        <uap3:Extension
                 Category="windows.appExecutionAlias"
                 Executable="WindowMessageSender\WindowMessageSender.exe"
                 EntryPoint="Windows.FullTrustApplication">
            <uap3:AppExecutionAlias>
                <desktop:ExecutionAlias Alias="WindowMessageSender.exe" />
            </uap3:AppExecutionAlias>
        </uap3:Extension>

        <uap:Extension Category="windows.protocol">★ココ
            <uap:Protocol Name="wmsender">
                <uap:Logo>images\StoreLogo.png</uap:Logo>
                <uap:DisplayName>WindowMessageSenderURI</uap:DisplayName>
            </uap:Protocol>
        </uap:Extension>
    </Extensions>
    
  </Application>
</Applications>

コード側で、URI起動されたことを知る

using Microsoft.UI.Xaml;
using Microsoft.Windows.AppLifecycle;
using System.Diagnostics;
using Windows.ApplicationModel.Activation;

namespace WindowMessageSender
{
    public partial class App : Application
    {
        public App()
        {
            this.InitializeComponent();
        }

        protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
        {
            var actEventArgs = Microsoft.Windows.AppLifecycle.AppInstance.GetCurrent().GetActivatedEventArgs();
            
            if (actEventArgs.Kind == ExtendedActivationKind.Protocol)
            {
                var d = actEventArgs.Data as IProtocolActivatedEventArgs;
                if (d != null)
                {
                    var uri = d.Uri;
                    var uriString = uri.AbsoluteUri;

                    Debug.WriteLine(uri);
                    Debug.WriteLine(uriString);
                }
            }

            m_window = new MainWindow();
            m_window.Activate();
        }

        private Window m_window;
    }
}

起動時、「wmsender:」で起動すると、

こうなる。、

また、起動時、「wmsender:aaaa/bbbb#12345」で起動すると、

こうなる。→引数、ではないが、URIになにかパラメータを載せることで、情報を渡すことができる。

参考

Handle URI activation
UWPのやり方なので、そのままではいかなかった。ので↓を見た。

https://learn.microsoft.com/en-us/windows/uwp/launch-resume/handle-uri-activation

URI アクティベーションを通じて WinUI Maui を開く方法は?
ここのやり方をまねしたのが今回のサンプルコード。

https://stackoverflow.com/questions/72606737/how-to-open-winui-maui-through-uri-activation