以前書いた記事「「ファイル名を指定して実行」からMicrosoft Edgeを起動する」を見ると分かる通り、Microsoft Edgeは実体となるexeファイルを実行する、通常の方法では起動できません。
Edgeのようなユニバーサル Windows プラットフォーム (UWP) アプリを起動するにはどうすれば良いか調べたところ「Windows 8 アプリのテストを自動化する」にその方法が載っていました。
アプリのアクティベーションは、IApplicationActivationManager インターフェイスを使うことで自動化できます。この API は、Visual Studio 2012 と同時に既定でインストールされる Windows SDK に含まれています。アプリの起動には IApplicationActivationManager::ActivateApplication (英語) メソッドを使います。
IApplicationActivationManager::ActivateApplicationメソッドを使えば良いみたいですね。
さっそくこのメソッドの呼び出し方について検索したところ、すぐに下記ページがヒットしました。
・com – IApplicationActivationManager::ActivateApplication in C#? – Stack Overflow
http://stackoverflow.com/questions/12925748/iapplicationactivationmanageractivateapplication-in-c
なるほど。VBAのWin32 API呼び出しみたいに、基本はヘッダーファイルを見て自分で書かないといけないわけですね・・・。
でも面倒くさいので、すでに回答者さんが書いているコードをほぼそのまま使うことにしました。
/* for reference: https://msdn.microsoft.com/en-us/library/hh706902.aspx http://stackoverflow.com/questions/12925748/iapplicationactivationmanageractivateapplication-in-c http://blogs.msdn.com/b/windowsappdev_ja/archive/2012/09/11/windows-8-automating-the-testing.aspx */ using System; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; namespace ExecMSEdge { class Program { private enum ACTIVATEOPTIONS : uint { AO_NONE = 0x00000000, AO_DESIGNMODE = 0x00000001, AO_NOERRORUI = 0x00000002, AO_NOSPLASHSCREEN = 0x00000004 } [ComImport, Guid("2e941141-7f97-4756-ba1d-9decde894a3d"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IApplicationActivationManager { IntPtr ActivateApplication([In] String appUserModelId, [In] String arguments, [In] ACTIVATEOPTIONS options, [Out] out UInt32 processId); IntPtr ActivateForFile([In] String appUserModelId, [In] IntPtr /*IShellItemArray* */ itemArray, [In] String verb, [Out] out UInt32 processId); IntPtr ActivateForProtocol([In] String appUserModelId, [In] IntPtr /* IShellItemArray* */itemArray, [Out] out UInt32 processId); } [ComImport, Guid("45BA127D-10A8-46EA-8AB7-56EA9078943C")] class ApplicationActivationManager : IApplicationActivationManager { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)/*, PreserveSig*/] public extern IntPtr ActivateApplication([In] String appUserModelId, [In] String arguments, [In] ACTIVATEOPTIONS options, [Out] out UInt32 processId); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] public extern IntPtr ActivateForFile([In] String appUserModelId, [In] IntPtr /*IShellItemArray* */ itemArray, [In] String verb, [Out] out UInt32 processId); [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] public extern IntPtr ActivateForProtocol([In] String appUserModelId, [In] IntPtr /* IShellItemArray* */itemArray, [Out] out UInt32 processId); } public static void Main(string[] args) { const string edgeID = "Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge"; uint pid; string url; if (args.Length > 0) { url = args[0]; } else { url = "//www.ka-net.org/blog/"; } ApplicationActivationManager aam = new ApplicationActivationManager(); aam.ActivateApplication(edgeID, url, ACTIVATEOPTIONS.AO_NONE, out pid); Console.Write("ProcessId:" + pid); } } }
引数で指定しているEdgeのAppUserModelID(Application User Model ID)は“Windows 8 アプリのテストを自動化する”にある通り、Get-AppxPackage コマンドレットで取得することができます。
しかしながら、メモ帳とかペイントであればProcess.Startで一発なものを、UWPアプリの場合はこんなに面倒くさいとは・・・。
microsoft-edgeスキームを使って起動した方がよっぽど簡単そうです。
この記事へのコメントはありません。