UWP の Print Support Application (PSA) に windows.printSupportSettingsUI を追加した途端、Manifest Designer の警告・API の未解決・マルチインスタンス要件などが雪だるま式に発生――そんな“あるある”を、確実に動作させるための実証済みプロセスと最小コードで解きほぐします。VS2019/VS2022 両対応、テスト観点や落とし穴も一挙にまとめました。
背景とゴール
PSA に プリンター専用の設定 UI を提供するには、アプリ パッケージに windows.printSupportSettingsUI 拡張を宣言し、起動時に ExtendedActivationKind.PrintSupportSettingsUI を受け取って UI を提示する必要があります。ところが実際には、ドキュメントとツールのギャップにより以下の障害に直面しやすく、「拡張が無効」「API が見つからない」「ビルド時に拡張が無視される」といった事象が発生します。本記事はそれらを再現 → 解消 → 動作確認まで一気通貫で解説します。
発生しやすい3つの障害
- 名前空間の食い違い: 文献では
uap4に宣言とあるが、実体はuap12以降で API が提供。Manifest Designer が「この拡張は無効」と警告する。 - マルチインスタンス必須: PSA の設定 UI は Multi-Instance UWP を前提とするが、Multi‑Instance App Project Templates (VSIX) は Visual Studio 2022 に未対応。
- VS2022 単体の落とし穴: 2022 で新規プロジェクトを作っても、
SupportsMultipleInstances追加だけでは拡張が無視・警告になることがある。
最短の結論(概要)
- プロジェクト作成は VS2019 のマルチインスタンス テンプレートを使用(作成後は VS2022 で開いて OK)。
- Manifest には
printsupport名前空間とdesktop4:SupportsMultipleInstances="true"を明示し、<Application>直下で拡張を宣言。 - Designer の警告はビルド&実機動作で無視可。Windows 11 22H2 (build 22621+) で起動確認。
- 起動ハンドリングは
App.OnActivatedでExtendedActivationKind.PrintSupportSettingsUIを受け取る。
課題と対処(要点早見表)
| 課題 | 解決策 | 備考 |
|---|---|---|
| マルチインスタンス必須 | まず Visual Studio 2019 に Multi‑Instance App Project Templates.VSIX を入れ、 テンプレートから新規 UWP(Multi‑Instance)を作成。作成後は VS2022 で読み込み可。 | VSIX は 2019 のみ対応。 |
| Manifest の書き方 | 以下 3 点を Package.appxmanifest に追加。① 名前空間宣言: xmlns:printsupport="http://schemas.microsoft.com/appx/manifest/printsupport/windows10"② マルチインスタンス指定: desktop4:SupportsMultipleInstances="true"③ 拡張宣言: <printsupport:Extension Category="windows.printSupportSettingsUI" EntryPoint="MyApp.PrintSettingsUI" /> | <Application> 要素下に配置。 |
| Manifest Designer の警告 | Designer の「無効」表示はビルドと実機動作が通るなら無視してよい。 | Windows 11 22H2 (10.0.22621+) で検証。 |
| 起動確認 | App.OnActivated(IActivatedEventArgs args) で ExtendedActivationKind.PrintSupportSettingsUI を判定し、PrintSupportSettingsUIActivatedEventArgs を取得。 | 最短で UI 起動を確認する手順。 |
| VS2022 だけで完結 | VS2022 で作って手動で desktop4:SupportsMultipleInstances="true" と拡張を追記する方法もあるが、テンプレートとの差異で警告や無視が出やすい。公式には VS2019 での作成が堅実。 | 将来は WinAppSDK の Print Workflow への移行検討。 |
環境要件と推奨構成
| 項目 | 要件 / 推奨 | 補足 |
|---|---|---|
| OS | Windows 11 22H2 (10.0.22621) 以上 | これ未満では拡張登録できても UI が起動しない |
| Visual Studio | 2019(テンプレート作成用) + 2022(開発/デバッグ用) | 2019 に Multi‑Instance テンプレートを導入 |
| Windows SDK | 10.0.22621 以降 | Windows.Graphics.Printing.PrintSupport API を含む |
| UWP ターゲット | ターゲット/最小ともに 10.0.22621 以上を推奨 | API/拡張のミスマッチを避ける |
実装手順(完全版)
1. マルチインスタンス UWP プロジェクトを用意
- VS2019 に Multi‑Instance App Project Templates.VSIX をインストール。
- テンプレートから新規 UWP(Multi‑Instance)プロジェクトを作成。
- 作成したソリューションを VS2022 で開く(以降の開発・デバッグは 2022 で可)。
2. Package.appxmanifest を編集
次の 3 点を追加します(<Application> 要素の中)。
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:desktop4="http://schemas.microsoft.com/appx/manifest/desktop/windows10/4"
xmlns:printsupport="http://schemas.microsoft.com/appx/manifest/printsupport/windows10"
IgnorableNamespaces="uap desktop4 printsupport">
<uap:VisualElements DisplayName="My PSA"
Square150x150Logo="Assets\Square150x150Logo.png"
Square44x44Logo="Assets\Square44x44Logo.png"
Description="PSA with Settings UI"
BackgroundColor="transparent" />
<Extensions>
<printsupport:Extension
Category="windows.printSupportSettingsUI"
EntryPoint="MyApp.PrintSettingsUI" />
</Extensions>
</Application>
ポイント: printsupport 名前空間宣言と desktop4:SupportsMultipleInstances="true" が肝です。<Extensions> は必ず <Application> の直下に置きます。Designer が「無効」と表示しても、実機で起動すれば正しく効いています。
3. 起動ハンドラを実装(最小確認コード)
設定 UI の起動は拡張アクティベーションとして飛んできます。App.xaml.cs の OnActivated で種別を判定してセッションを受け取ります。
using Windows.ApplicationModel.Activation;
using Windows.Graphics.Printing.PrintSupport;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
sealed partial class App : Application
{
protected override void OnActivated(IActivatedEventArgs args)
{
if (args.Kind == ExtendedActivationKind.PrintSupportSettingsUI)
{
var sArgs = (PrintSupportSettingsUIActivatedEventArgs)args;
PrintSupportSettingsUISession session = sArgs.Session;
// 最小のホスト Window を用意
var frame = Window.Current.Content as Frame ?? new Frame();
Window.Current.Content = frame;
// 設定 UI のページへ遷移(任意)
frame.Navigate(typeof(SettingsUIPage), session);
Window.Current.Activate();
return;
}
base.OnActivated(args);
}
}
この時点で、対象プリンターから設定 UI を開くと SettingsUIPage が起動し、パラメータとして PrintSupportSettingsUISession が届きます。UI からセッション API を使ってプリンター固有の設定を読み書きできます。
4. マルチインスタンスの確認
PSA はジョブ/セッション単位で複数インスタンスが走る設計です。動作確認の際は AppInstance を使って現在のインスタンス数を把握すると安定します。
using Windows.ApplicationModel;
int instanceCount =
Windows.ApplicationModel.AppInstance.GetInstances().Count;
// デバッグ表示などで確認
System.Diagnostics.Debug.WriteLine($"Instances: {instanceCount}");
動作検証のやり方(最短)
- 対象マシンが Windows 11 22H2 (build 22621+) であることを確認。
- アプリを登録(デプロイ)後、プリンターのプロパティから PSA の設定 UI を起動。
OnActivatedが呼ばれ、ExtendedActivationKind.PrintSupportSettingsUIかつSessionが取得できるかデバッグ出力で確認。- 設定 UI のページで最低限の UI(テキスト/トグル)を表示し、値をセッションに反映できるかチェック。
よくある警告・エラーと対処
| メッセージ/症状 | 原因 | 対処 |
|---|---|---|
| Manifest Designer が「拡張が無効」 | Designer の検証ロジックが古い/狭い | ビルド・デプロイ・実機起動で確認。無視可 |
| API が見つからない(参照解決不可) | Windows SDK が古い、もしくは Min/Target が不足 | SDK/Target/Min を 10.0.22621 以上に |
| 拡張が無視される/効かない | アプリがシングルインスタンスのまま | desktop4:SupportsMultipleInstances="true" を確認 |
| VS2022 で新規作成すると動かない | テンプレート差異で必要な要素が不足 | VS2019 テンプレートで新規作成 → 2022 で開く |
| UI が起動しない(OS 依存) | Windows 11 のビルドが未達 | 22H2 (build 22621+) に更新 |
実装のベストプラクティス
- セッション境界で状態管理:
PrintSupportSettingsUISessionをキーに、UI 状態やプリンター固有の設定を分離。並行ジョブでも相互干渉しないよう セッション別ディクショナリで保持。 - 通信は軽量に: 設定の永続化やドライバとのやり取りは
AppServiceConnection等で切り出し、UI スレッドをブロックしない。 - フェイルセーフ: OS/ドライバからセッションが突然終了しても UI が例外で落ちないよう
try/catchとキャンセル伝播を実装。 - 診断ログ: 起動種別、セッション ID、インスタンス数、適用した設定の要約を
EventSourceまたはDebugで記録。
サンプル:設定 UI ページの最小コード
using Windows.Graphics.Printing.PrintSupport;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
public sealed partial class SettingsUIPage : Page
{
private PrintSupportSettingsUISession _session;
public SettingsUIPage()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(Windows.UI.Xaml.Navigation.NavigationEventArgs e)
{
_session = (PrintSupportSettingsUISession)e.Parameter;
// 例: 既定オプションの読み込み(実際のキーはプリンター固有)
// var ticket = _session.SettingsTicket; // 読み書きする
base.OnNavigatedTo(e);
}
private void ApplyButton_Click(object sender, RoutedEventArgs e)
{
// TODO: UI の状態を _session に反映
// _session.TryUpdateDefaultPrintTicket(...);
// 必要に応じて完了通知・遷移など
}
}
マニフェスト全体例(ミニマム構成)
以下は記事内の要点を一つにまとめた最小例です。既存のロゴ/言語/能力などは環境に合わせて調整してください。
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:desktop4="http://schemas.microsoft.com/appx/manifest/desktop/windows10/4"
xmlns:printsupport="http://schemas.microsoft.com/appx/manifest/printsupport/windows10"
IgnorableNamespaces="uap desktop4 printsupport">
My PSA
Contoso
Assets\StoreLogo.png
<uap:VisualElements
DisplayName="My PSA"
Square150x150Logo="Assets\Square150x150Logo.png"
Square44x44Logo="Assets\Square44x44Logo.png"
Description="PSA with Settings UI"
BackgroundColor="transparent" />
<Extensions>
<printsupport:Extension
Category="windows.printSupportSettingsUI"
EntryPoint="MyApp.PrintSettingsUI" />
</Extensions>
</Application>
テスト観点(チェックリスト)
| 観点 | 確認内容 | 期待結果 |
|---|---|---|
| 拡張登録 | デプロイ後、拡張が有効化されるか | 設定 UI 要求時にアプリが起動 |
| アクティベーション | OnActivated の Kind 判定 | PrintSupportSettingsUI を受け取る |
| セッション | PrintSupportSettingsUISession の取得・利用 | UI から設定を読み/書きできる |
| 並行性 | 複数ジョブ同時起動での干渉 | 各インスタンスが独立して動作 |
| フォールバック | OS 要件未達時の挙動 | UI 非起動でもアプリがクラッシュしない |
VS2022 だけで進めたい場合の現実解
VS2022 で新規プロジェクトを作り、手動で desktop4:SupportsMultipleInstances="true" と printsupport:Extension を追記して動作するケースはあります。ただ、テンプレート由来の差分(既定の redirect ロジックや追加の設定)がないため、環境によっては拡張が無視される・警告が残ることがあります。最短で確実に進めるなら、やはり VS2019 の Multi‑Instance テンプレートで雛形を作るのが堅実です。
運用の小技(デバッグ/診断)
- インスタンス数をログ:
AppInstance.GetInstances().Countを起動時に出力。 - セッションごとにトレース ID: セッションに紐づく GUID を UI/ログに表示して問い合わせ対応を短縮。
- AppService による軽量 IPC: ジョブ数増加時も UI 応答性を確保。
- 例外/キャンセル整備: セッション終了イベントで UI をクリーンアップ。
移行戦略:WinAppSDK + WinUI 3
UWP は保守モードに入りつつあるため、今後の機能拡張や長期運用を見据えるなら WinAppSDK + WinUI 3 の Print Workflow サポートを検討してください。新 API はモダンな構成・配布モデルと相性がよく、CI/CD と組み合わせた検証が容易になります。現行 PSA を維持しつつ、設定 UI の要件を洗い出して段階的に移行する二段構えが実務的です。
トラブル時の切り分けフロー
- OS ビルド確認: まず 22621+ であることを確認。
- Manifest 静的確認:
printsupport名前空間/desktop4:SupportsMultipleInstances/<Application>直下の配置。 - 起動経路確認:
OnActivatedへ到達するか/Kindが想定どおりか。 - セッション確認:
Sessionがnullでないか、例外が出ていないか。 - 並行実行確認: インスタンス数とセッションごとの独立性。
まとめ
以上の手順を踏めば、Manifest Designer の警告が残っていてもPrint Support Settings UI 拡張は正常に機能します。カギは以下の 3 点です。
- VS2019 のマルチインスタンス テンプレートで雛形を作る(その後は VS2022 で開発)。
printsupport名前空間とdesktop4:SupportsMultipleInstances="true"をマニフェストに正しく宣言。App.OnActivatedでExtendedActivationKind.PrintSupportSettingsUIをハンドリングし、セッションを受ける。
このセットアップにより、プリンターごとの詳細設定画面を PSA 内から安定して提供でき、並行ジョブでも破綻しない堅牢な UX を実装できます。

コメント