2025年12月28日日曜日

ストアアプリの起動方法

 Pythonからスケジュールナースを起動する方法を聞きました。

なるほど、Microsoft StoreアプリをPythonから起動したいということですね。

通常のC#コンソールアプリやEXEなら subprocess.Popen() で直接呼べますが、Storeアプリ (UWPアプリ) は少し特殊です。ポイントを整理します:


🏗 Microsoft Storeアプリの起動方法

1. AppUserModelID を使う

  • UWPアプリは「実行ファイル」ではなく「パッケージ」として登録されています。
  • そのため、起動には AppUserModelID または プロトコルURI を指定する必要があります。
  • Windowsでは explorer.exe shell:AppsFolder\<AppUserModelID> で起動可能。

例:

import subprocess

# AppUserModelIDを指定して起動
subprocess.run([
    "explorer.exe",
    "shell:AppsFolder\\Microsoft.WindowsCalculator_8wekyb3d8bbwe!App"
])

※上記は「電卓」アプリの例。Microsoft.WindowsCalculator_8wekyb3d8bbwe!App がAppUserModelIDです。


2. AppUserModelIDの調べ方

  • PowerShellで以下を実行すると一覧が出ます:
Get-StartApps
  • 出力に「Name」と「AppID」があり、AppID が起動に必要なIDです。

3. プロトコルURIを使う方法

  • 一部のアプリは ms- で始まるURIスキームを持っています。
  • 例えば「設定」アプリは:
subprocess.run(["start", "ms-settings:"], shell=True)
  • ただし、これはアプリごとにサポート状況が異なります。

✅ Takさんのケースでの流れ

  1. PowerShellで Get-StartApps を実行 → 対象のC# Storeアプリの AppID を確認
  2. Pythonから subprocess.run(["explorer.exe", "shell:AppsFolder\\<AppID>"]) で起動

🎯 実運用のヒント

  • AppIDは環境依存なので、インストール環境ごとに確認が必要です。
  • エラーハンドリングを入れて、アプリが存在しない場合はログを出すようにすると堅牢。
  • 頻繁に呼び出すなら、AppIDを設定ファイルに保存しておくと便利です。

👉 TakさんのC#アプリは「UWP (Storeアプリ)」でしょうか?それとも「Win32アプリをStore経由で配布」したものですか?
(Win32なら通常のEXE起動で済みますが、UWPなら上記のようにAppID経由が必要です)


はい、可能です。PowerShellを経由せずに Pythonから直接「Get-StartApps」と同等の情報(インストール済みアプリ一覧)を取得する方法があります。ポイントは、Windowsの AppxPackage APIShell API を使うことです。


🔎 方法の選択肢

1. WinRT API (Pythonから呼び出し)

  • UWP/Win32アプリの一覧は Windows.Management.Deployment.PackageManager で取得可能。
  • Pythonでは winrt パッケージを使うと呼び出せます。

例:

pip install winrt
import winrt.windows.management.deployment as deployment

pm = deployment.PackageManager()
packages = pm.FindPackages()

for pkg in packages:
    print(pkg.Id.FullName)

これで、PowerShellの Get-AppxPackage と同じようにパッケージ一覧が取れます。
ただし、Win32アプリがStore経由で配布されている場合はここに含まれます。


2. Windows Shell API (AppUserModelID取得)

  • Get-StartApps が返す「AppID」は、実際には Shellのスタートメニュー登録情報です。
  • Pythonからは ctypespywin32 を使って COM API (IStartMenuPinnedList, IApplicationActivationManager) を呼び出すことで同等の情報が取得可能です。

例(起動用):

import ctypes

appid = "Microsoft.WindowsCalculator_8wekyb3d8bbwe!App"
ctypes.windll.shell32.ShellExecuteW(None, "open", f"shell:AppsFolder\\{appid}", None, None, 1)

一覧取得は少し複雑ですが、pywin32win32com.client.Dispatch("Shell.Application") を使ってスタートメニューの登録を列挙できます。


3. レジストリを直接読む

  • スタートメニューに登録されているアプリはレジストリにも保存されています。
  • 例えば:
    • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall
    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore
  • Pythonの winreg モジュールで読み取れば、PowerShellを使わずに一覧化可能です。

✅ 結論

  • UWP/Storeアプリ一覧winrt パッケージで PackageManager を使うのが最も簡単。
  • Win32アプリ (Store配布含む) のAppID一覧 → COM API (Shell.Application) をPythonから呼び出す。
  • レジストリ直接参照 → 最低限の情報だけ欲しい場合に有効。

👉 Takさんの目的は「Pythonから対象アプリのAppIDを取得して起動」だと思いますが、
その場合は COM APIでスタートメニューの登録を列挙するのが一番近道です。

ご希望に合わせて、**「PythonでGet-StartApps相当の一覧を出す完全コード例」**を提示しましょうか?


0 件のコメント:

コメントを投稿