UWPのPrint Support Settings UI拡張が追加できない時の対処法|VS2019/VS2022・マニフェスト完全ガイド

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 への移行検討。

環境要件と推奨構成

項目要件 / 推奨補足
OSWindows 11 22H2 (10.0.22621) 以上これ未満では拡張登録できても UI が起動しない
Visual Studio2019(テンプレート作成用) + 2022(開発/デバッグ用)2019 に Multi‑Instance テンプレートを導入
Windows SDK10.0.22621 以降Windows.Graphics.Printing.PrintSupport API を含む
UWP ターゲットターゲット/最小ともに 10.0.22621 以上を推奨API/拡張のミスマッチを避ける

実装手順(完全版)

1. マルチインスタンス UWP プロジェクトを用意

  1. VS2019 に Multi‑Instance App Project Templates.VSIX をインストール。
  2. テンプレートから新規 UWP(Multi‑Instance)プロジェクトを作成。
  3. 作成したソリューションを 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}"); 

動作検証のやり方(最短)

  1. 対象マシンが Windows 11 22H2 (build 22621+) であることを確認。
  2. アプリを登録(デプロイ)後、プリンターのプロパティから PSA の設定 UI を起動。
  3. OnActivated が呼ばれ、ExtendedActivationKind.PrintSupportSettingsUI かつ Session が取得できるかデバッグ出力で確認。
  4. 設定 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 の要件を洗い出して段階的に移行する二段構えが実務的です。

トラブル時の切り分けフロー

  1. OS ビルド確認: まず 22621+ であることを確認。
  2. Manifest 静的確認: printsupport 名前空間/desktop4:SupportsMultipleInstances/<Application> 直下の配置。
  3. 起動経路確認: OnActivated へ到達するか/Kind が想定どおりか。
  4. セッション確認: Session が null でないか、例外が出ていないか。
  5. 並行実行確認: インスタンス数とセッションごとの独立性。

まとめ

以上の手順を踏めば、Manifest Designer の警告が残っていてもPrint Support Settings UI 拡張は正常に機能します。カギは以下の 3 点です。

  • VS2019 のマルチインスタンス テンプレートで雛形を作る(その後は VS2022 で開発)。
  • printsupport 名前空間と desktop4:SupportsMultipleInstances="true" をマニフェストに正しく宣言。
  • App.OnActivated で ExtendedActivationKind.PrintSupportSettingsUI をハンドリングし、セッションを受ける。

このセットアップにより、プリンターごとの詳細設定画面を PSA 内から安定して提供でき、並行ジョブでも破綻しない堅牢な UX を実装できます。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次