Power Automate for desktop

Power Automate Desktopでストアアプリを実行する方法

Power Platform CommunityにPower Automate Desktop(PAD)からストアアプリ版のPower BIを実行したいとの質問がありました。

通常のアプリケーションはパスを指定して実行できますが、ストアアプリではそれができません。例えばストアアプリの「切り取り & スケッチ」の実行ファイルのパスは下記の通りですが、このパスを指定しても実行時にはエラーが発生します。

C:\Program Files\WindowsApps\Microsoft.ScreenSketch_10.2008.2277.0_x64__8wekyb3d8bbwe\ScreenSketch.exe

このようなストアアプリを実行したい場合、最も簡単なのはアプリに関連付けられたURIスキームを指定することです。

上記の「切り取り & スケッチ」の場合は、アプリケーション パスに「ms-screensketch:」(最後の :(コロン) は必須)を指定することで、PADからアプリケーションを実行できます。

アプリに関連付けられたURIスキームの取得方法

URIスキームは下記レジストリ以下にある「CustomProperties」キーから「Name」エントリの値として取得できます。

HKEY_CLASSES_ROOT\Extensions\ContractId\Windows.Protocol\PackageId\

例えば「切り取り & スケッチ」の場合は下記の通りです。

[HKEY_CLASSES_ROOT\Extensions\ContractId\Windows.Protocol\PackageId\Microsoft.ScreenSketch_10.2008.2277.0_x64__8wekyb3d8bbwe\ActivatableClassId\App.AppXwnmr9952bptdbfyz5zk8cebdbtcyf7na.mca\CustomProperties]
"Name"="ms-screensketch"

CustomPropertiesキーを1つずつ確認していくのは大変ですが、下記PowerShellコードを実行することで、必要な値のみを抜き出せます。

(Get-ChildItem -Path "Registry::HKCR\Extensions\ContractId\Windows.Protocol\PackageId\" -Include "CustomProperties" -Recurse | Get-ItemProperty).Name

AppUserModelId(AUMID)によるストアアプリの実行方法

下記記事でも書いている通り、ストアアプリはAppUserModelId(Application User Model ID)を指定することでも実行できます。

例えば「切り取り & スケッチ」の場合はAUMIDが「Microsoft.ScreenSketch_8wekyb3d8bbwe!App」なので、アプリケーション パスに下記を指定することで、PADからアプリケーションを実行できます。

shell:AppsFolder\Microsoft.ScreenSketch_8wekyb3d8bbwe!App

上記記事のスクリプトを一部変更して、下記フローのようにアプリ名を指定して実行することもできます。

# アプリ名を指定してストアアプリを実行するPADフロー
Display.InputDialog Title: $'''アプリ名入力''' Message: $'''実行するアプリ名を入力してください。''' DefaultValue: $'''切り取り''' InputType: Display.InputType.SingleLine IsTopMost: True UserInput=> AppName ButtonPressed=> ButtonPressed
IF ButtonPressed = $'''OK''' THEN
    IF AppName.Length > 0 THEN
        # VBSでアプリのAppUserModelId(AUMID)を取得
        System.RunVBScript VBScriptCode: $'''Option Explicit

Dim itm

With CreateObject(\"Shell.Application\").Namespace(\"shell:AppsFolder\")
  For Each itm In .Items
    If InStr(LCase(itm.Name), LCase(\"%AppName%\")) Then
      WScript.Echo itm.Path
      Exit For
    End If
  Next
End With''' ScriptOutput=> AUMID ScriptError=> ScriptError
        IF AUMID.IsEmpty = $'''False''' THEN
            Text.Trim Text: AUMID TrimOption: Text.TrimOption.Both TrimmedText=> AUMID
            System.RunApplication ApplicationPath: $'''shell:AppsFolder\\%AUMID%''' WindowStyle: System.ProcessWindowStyle.Normal ProcessId=> AppProcessId
        ELSE
            Display.ShowMessageWithTimeout Message: $'''アプリ名「%AppName%」が見つかりませんでした。''' Icon: Display.Icon.Warning Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True Timeout: 3 ButtonPressed=> ButtonPressed2
        END
    END
END

上記フローでは「shell:AppsFolder」経由でアプリを実行していますが、AUMIDが分かればPowerShell経由でIApplicationActivationManager::ActivateApplicationメソッドを呼び出すことでもストアプリを実行できます。

ただ、処理後にアプリを終了する等、プロセスIDを使って何か処理を行う必要がない場合は「shell:AppsFolder」経由での実行で十分だと思います。

# アプリ名を指定してストアアプリを実行するPADフロー
Display.InputDialog Title: $'''アプリ名入力''' Message: $'''実行するアプリ名を入力してください。''' DefaultValue: $'''切り取り''' InputType: Display.InputType.SingleLine IsTopMost: True UserInput=> AppName ButtonPressed=> ButtonPressed
IF ButtonPressed = $'''OK''' THEN
    IF AppName.Length > 0 THEN
        # VBSでアプリのAppUserModelId(AUMID)を取得
        System.RunVBScript VBScriptCode: $'''Option Explicit

Dim itm

With CreateObject(\"Shell.Application\").Namespace(\"shell:AppsFolder\")
  For Each itm In .Items
    If InStr(LCase(itm.Name), LCase(\"%AppName%\")) Then
      WScript.Echo itm.Path
      Exit For
    End If
  Next
End With''' ScriptOutput=> AUMID ScriptError=> ScriptError
        IF AUMID.IsEmpty = $'''False''' THEN
            Text.Trim Text: AUMID TrimOption: Text.TrimOption.Both TrimmedText=> AUMID
            # IApplicationActivationManager::ActivateApplicationメソッドでアプリを実行することでプロセスIDを取得
            System.RunPowershellScript Script: $'''$code = @\"
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
 
namespace ExecStoreApp
{
  [ComImport, Guid(\"2e941141-7f97-4756-ba1d-9decde894a3d\"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
  interface IApplicationActivationManager
  {
    IntPtr ActivateApplication([In] String appUserModelId, [In] String arguments, [In] UInt32 options, [Out] out UInt32 processId);
  }
   
  [ComImport, Guid(\"45BA127D-10A8-46EA-8AB7-56EA9078943C\")]
  public class ApplicationActivationManager : IApplicationActivationManager
  {
    [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)/*, PreserveSig*/]
    public extern IntPtr ActivateApplication([In] String appUserModelId, [In] String arguments, [In] UInt32 options, [Out] out UInt32 processId);
  }
}
\"@
Add-Type $code
$processId = 0
$aam = New-Object ExecStoreApp.ApplicationActivationManager
$res = $aam.ActivateApplication(\"%AUMID%\", $null, 0, [ref]$processId)
Write-Output $processId''' ScriptOutput=> ProcessId ScriptError=> ScriptError2
            Text.Trim Text: ProcessId TrimOption: Text.TrimOption.Both TrimmedText=> ProcessId
            Display.ShowMessageWithTimeout Message: $'''起動したアプリのプロセスID:%ProcessId%''' Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True Timeout: 3 ButtonPressed=> ButtonPressed3
            System.TerminateProcessById ProcessId: ProcessId
        ELSE
            Display.ShowMessageWithTimeout Message: $'''アプリ名「%AppName%」が見つかりませんでした。''' Icon: Display.Icon.Warning Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True Timeout: 3 ButtonPressed=> ButtonPressed2
        END
    END
END

上記の通り、URIスキームやAUMIDを指定することでPADからストアプリを実行できますので、ストアアプリの制御が必要な際には是非お試しください。

参考Webサイト

関連記事

2021年7月の人気記事前のページ

Power Automate DesktopのPDFアクションがWebサービスを使っているのか調べてみました。次のページ

関連記事

  1. Power Automate for desktop

    APIを使ったkintoneとPower Automate for desktopの連携

    前回の記事でkintone 開発者ライセンスの取得方法を紹介したので、…

  2. Power Automate for desktop

    無料で学ぶPower Automate Desktop

    下記記事にある通り、2021年の3月からPower Automate …

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP