次の方法で共有


UWP デバイス アプリでプリンターのメンテナンスを行う方法

Windows 8.1 では、UWP デバイス アプリは、印刷ヘッドの配置やノズルのクリーニングなど、プリンターのメンテナンスを実行できます。 このトピックでは、C# バージョンの 印刷ジョブ管理とプリンターのメンテナンス サンプルを使用して、双方向通信 (Bidi) を使用してこのようなデバイス メンテナンスを実行する方法を示します。 UWP デバイス アプリ全般の詳細については、「UWP デバイス アプリを使用する」を参照してください。

C# バージョンの印刷ジョブ管理およびプリンター メンテナンス サンプルでは、DeviceAppForPrinters2 プロジェクトのDeviceMaintenance.xaml.cs ファイルを使用したプリンターのメンテナンスを示します。 Bidi を操作するために、このサンプルでは PrinterExtensionLibrary プロジェクトのプリンター拡張ライブラリを使用します。 プリンター拡張ライブラリは、v4 印刷ドライバーのプリンター拡張インターフェイスにアクセスするための便利な方法を提供します。 詳細については、 プリンター拡張ライブラリの概要を参照してください。

このトピックに示すコード例は、 印刷ジョブ管理とプリンターのメンテナンス サンプルの C# バージョンに基づいています。 このサンプルは、JavaScript と C++ でも使用できます。 C++ は COM に直接アクセスできるため、C++ バージョンのサンプルにはコード ライブラリ プロジェクトが含まれていないことに注意してください。 サンプルをダウンロードして、最新バージョンのコードを確認します。

プリンターのメンテナンス

Windows 8.1 では、デバイスメンテナンスの実装に使用できる v4 プリンター ドライバーに新しいプリンター拡張機能インターフェイスが導入されています。 IPrinterBidiSetRequestCallbackIPrinterExtensionAsyncOperationおよび IPrinterQueue2。 これらのインターフェイスを使用すると、デバイスとプロトコル固有のコマンドに変換してプリンターに送信できるように、Bidi 要求をポート モニターに非同期的に送信できます。 詳細については、「 デバイスのメンテナンス (v4 プリンター ドライバー)」を参照してください。

ヒント

C# アプリと JavaScript アプリは、COM API を直接操作できません。 C# または JavaScript UWP デバイス アプリを作成する場合は、プリンター拡張機能ライブラリを使用してこれらのインターフェイスにアクセスします (このトピックを参照)。

前提条件

開始する前に、以下の操作を行います。

  1. v4 プリンター ドライバーを使用してプリンターがインストールされていることを確認します。 詳細については、「 v4 印刷ドライバーの開発」を参照してください。

  2. 開発用 PC をセットアップします。 ツールのダウンロードと開発者アカウントの作成については、「 作業の開始 」を参照してください。

  3. アプリをストアに関連付けます。 詳細については、「 UWP デバイス アプリの作成 」を参照してください。

  4. プリンターをアプリに関連付けるプリンターのデバイス メタデータを作成します。 詳細については、「 デバイス メタデータの作成 」を参照してください。

  5. アプリのメイン ページの UI をビルドします。 すべての UWP デバイス アプリはスタート画面から起動でき、全画面表示で表示されます。 スタート エクスペリエンスを使用して、デバイスの特定のブランドと機能に一致する方法で製品またはサービスを強調表示します。 使用できる UI コントロールの種類に特別な制限はありません。 全画面表示エクスペリエンスの設計を開始するには、 Microsoft Store の設計原則を参照してください。

  6. C# または JavaScript を使用してアプリを作成する場合は、 PrinterExtensionLibrary プロジェクトを UWP デバイス アプリ ソリューションに追加します。 このプロジェクトは、 印刷ジョブの管理とプリンターのメンテナンス サンプルで確認できます。

C++ は COM に直接アクセスできるため、C++ アプリでは、COM ベースのプリンター デバイス コンテキストを操作するために別のライブラリは必要ありません。

手順 1: Bidi 要求を準備する

デバイス メンテナンス インターフェイスでは、Bidi 要求が文字列形式の XML データである必要があります。 アプリで意味のある場所であればどこでも、Bidi 要求を作成できます。 たとえば、Bidi 要求を文字列定数として保存したり、ユーザー入力に基づいて動的に作成したりできます。 印刷ジョブの管理とプリンターのメンテナンスのサンプルでは、OnNavigatedToメソッドで既定の要求を作成します。 Bidi の詳細については、「 双方向通信」を参照してください。

この例は、DeviceMaintenance.xaml.cs ファイルの OnNavigatedTo メソッドの例です。

string defaultBidiQuery =
    "<bidi:Set xmlns:bidi=\"http://schemas.microsoft.com/windows/2005/03/printing/bidi\">\r\n" +
    "    <Query schema='\\Printer.Maintenance:CleanHead'>\r\n" +
    "        <BIDI_BOOL>false</BIDI_BOOL>\r\n" +
    "    </Query>\r\n" +
    "</bidi:Set>";

手順 2: プリンターを検索する

アプリでプリンターにコマンドを送信するには、まずプリンターを見つける必要があります。 これを行うには、印刷ジョブの管理とプリンターのメンテナンスのサンプルには、(PrinterEnumeration.cs ファイル内の) PrinterEnumerationという名前のクラスが含まれています。 このクラスは、デバイス メタデータを使用してアプリに関連付けられているすべてのプリンターを検索し、各プリンターの名前とデバイス ID を含む PrinterInfo オブジェクトの一覧を返します。

この例は、DeviceMaintenance.xaml.cs ファイルの EnumeratePrinters_Click メソッドの例です。 このサンプルでは、 PrinterEnumeration クラスを使用して、関連付けられているプリンターの一覧を取得する方法を示します。

private async void EnumeratePrinters_Click(object sender, RoutedEventArgs e)
{
    try
    {
        rootPage.NotifyUser("Enumerating printers. Please wait", NotifyType.StatusMessage);

        // Retrieve the running app's package family name, and enumerate associated printers.
        string currentPackageFamilyName = Windows.ApplicationModel.Package.Current.Id.FamilyName;

        // Enumerate associated printers.
        PrinterEnumeration pe = new PrinterEnumeration(currentPackageFamilyName);
        List<PrinterInfo> associatedPrinters = await pe.EnumeratePrintersAsync();

        // Update the data binding source on the combo box that displays the list of printers.
        PrinterComboBox.ItemsSource = associatedPrinters;
        if (associatedPrinters.Count > 0)
        {
            PrinterComboBox.SelectedIndex = 0;
            rootPage.NotifyUser(associatedPrinters.Count + " printers enumerated", NotifyType.StatusMessage);
        }
        else
        {
            rootPage.NotifyUser(DisplayStrings.NoPrintersEnumerated, NotifyType.ErrorMessage);
        }
    }
    catch (Exception exception)
    {
        rootPage.NotifyUser("Caught an exception: " + exception.Message, NotifyType.ErrorMessage);
    }
}

ヒント

PrinterEnumerationクラスとPrinterInfo クラスの詳細については、PrinterEnumeration.cs ファイルを参照してください。

手順 3: Bidi 要求を送信する

Bidi 要求を送信するには、デバイス メンテナンス インターフェイスに Bidi 文字列とコールバックが必要です。 SendBidiRequest_Click メソッドでは、最初にPrinterInfo オブジェクトを使用して、contextという名前のプリンター拡張コンテキスト オブジェクトを作成します。 その後、 PrinterBidiSetRequestCallback オブジェクトが作成され、コールバックの OnBidiResponseReceived イベントを処理するイベント ハンドラーが追加されます。 最後に、プリンター拡張コンテキストの SendBidiSetRequestAsync メソッドを使用して、Bidi 文字列とコールバックを送信します。

この例は、DeviceMaintenance.xaml.cs ファイルの SendBidiRequest_Click メソッドの例です。

private void SendBidiRequest_Click(object sender, RoutedEventArgs e)
{
    try
    {
        PrinterInfo queue = (PrinterInfo)PrinterComboBox.SelectedItem;

        // Retrieve a COM IPrinterExtensionContext object, using the static WinRT factory.
        // Then instantiate one "PrinterExtensionContext" object that allows operations on the COM object.
        Object comContext = Windows.Devices.Printers.Extensions.PrintExtensionContext.FromDeviceId(queue.DeviceId);
        PrinterExtensionContext context = new PrinterExtensionContext(comContext);

        // Create an instance of the callback object, and perform an asynchronous 'bidi set' operation.
        PrinterBidiSetRequestCallback callback = new PrinterBidiSetRequestCallback();

        // Add an event handler to the callback object's OnBidiResponseReceived event.
        // The event handler will be invoked once the Bidi response is received.
        callback.OnBidiResponseReceived += OnBidiResponseReceived;

        // Send the Bidi "Set" query asynchronously.
        IPrinterExtensionAsyncOperation operationContext
            = context.Queue.SendBidiSetRequestAsync(BidiQueryInput.Text, callback);

        // Note: The 'operationContext' object can be used to cancel the operation if required.
    }
    catch (Exception exception)
    {
        rootPage.NotifyUser("Caught an exception: " + exception.Message, NotifyType.ErrorMessage);
    }
}

手順 4: Bidi の応答を受け取る

Bidi の "set" 操作が完了すると、 PrinterBidiSetRequestCallback型のコールバック オブジェクトが呼び出されます。 このコールバックは、HRESULT 応答からのエラー処理を処理し、イベント パラメーターを介して Bidi 応答を送信して、 OnBidiResponseReceived イベントをトリガーします。

この例では、DeviceMaintenance.xaml.cs ファイル内のPrinterBidiSetRequestCallback クラス定義を示します。

internal class PrinterBidiSetRequestCallback : IPrinterBidiSetRequestCallback
{
    /// <summary>
    /// This method is invoked when the asynchronous Bidi "Set" operation is completed.
    /// </summary>
    public void Completed(string response, int statusHResult)
    {
        string result;

        if (statusHResult == (int)HRESULT.S_OK)
        {
            result = "The response is \r\n" + response;
        }
        else
        {
            result = "The HRESULT received is: 0x" + statusHResult.ToString("X") + "\r\n" +
                     "No Bidi response was received";
        }

        // Invoke the event handlers when the Bidi response is received.
        OnBidiResponseReceived(null, result);
    }

    /// <summary>
    /// This event will be invoked when the Bidi 'set' response is received.
    /// </summary>
    public event EventHandler<string> OnBidiResponseReceived;
}

その後、Bidi 応答が OnBidiResponseReceived メソッドに送信されます。ここで、 Dispatcher を使用して UI スレッドに結果が表示されます。

この例は、DeviceMaintenance.xaml.cs ファイルの OnBidiResponseReceived メソッドの例です。

internal async void OnBidiResponseReceived(object sender, string bidiResponse)
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        BidiResponseOutput.Text = bidiResponse;
    });
}

テスティング

UWP デバイス アプリをテストする前に、デバイス メタデータを使用してプリンターにリンクする必要があります。

デバイス アプリ情報をプリンターに追加するには、プリンターのデバイス メタデータ パッケージのコピーが必要です。 デバイス メタデータがない場合は、「UWP デバイス アプリのデバイス メタデータを作成する」のトピックの説明に従って、デバイス メタデータ作成ウィザードを使用して作成できます。

デバイス メタデータ作成ウィザードを使用するには、このトピックの手順を完了する前に、Microsoft Visual Studio Professional、Microsoft Visual Studio Ultimate、または Windows 8.1 用スタンドアロン SDK をインストールする必要があります。 Microsoft Visual Studio Express for Windows をインストールすると、ウィザードを含まないバージョンの SDK がインストールされます。

次の手順では、アプリをビルドし、デバイス メタデータをインストールします。

  1. テスト署名を有効にします。

    1. %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86 から、DeviceMetadataWizard.exe をダブルクリックしてデバイス メタデータ作成ウィザードを起動してください。

    2. [ツール] メニューの [テスト署名を有効にする] を選択します。

  2. コンピューターを再起動する

  3. ソリューション (.sln) ファイルを開いてソリューションをビルドします。 F7 キーを押すか、サンプルが読み込まれた後、上部のメニューから Build->Build ソリューション に移動します。

  4. プリンターを取り外してアンインストールします。 この手順は、次回デバイスが検出されるときに更新されたデバイス メタデータを Windows が読み取るようにする必要があります。

  5. デバイス メタデータを編集して保存します。 デバイス アプリをデバイスにリンクするには、デバイス アプリをデバイスに関連付ける必要があります。 手記: デバイス メタデータをまだ作成していない場合は、「 UWP デバイス アプリのデバイス メタデータを作成する」を参照してください。

    1. デバイス メタデータ作成ウィザードがまだ開いていない場合は、DeviceMetadataWizard.exeをダブルクリックして、%ProgramFiles(x86)%\Windows Kits\8.1\bin\x86 から起動します。

    2. [ デバイス メタデータの編集] をクリックします。 これにより、既存のデバイス メタデータ パッケージを編集できます。

    3. [ 開く ] ダイアログ ボックスで、UWP デバイス アプリに関連付けられているデバイス メタデータ パッケージを見つけます。 ( devicemetadata-ms ファイル拡張子があります)。

    4. [ UWP デバイス アプリ情報の指定 ] ページで、[ UWP デバイス アプリ] ボックスに Microsoft Store アプリ情報を入力します。 「インポート UWP アプリ マニフェスト ファイル をクリックすると、パッケージ名発行元名、および UWP アプリ ID が自動的に入力されます。」

    5. アプリがプリンター通知に登録している場合は、「通知ハンドラー」ボックスに記入します。 イベント ID に印刷イベントハンドラーの名前を入力します。 イベント アセットで、コードが含まれているファイル名を入力してください。

    6. 完了したら、[完了] ページが表示されるまで [次へ] をクリックします。

    7. [ デバイス メタデータ パッケージの確認 ] ページで、すべての設定が正しいことを確認し、[ ローカル コンピューター上のメタデータ ストアにデバイス メタデータ パッケージをコピー する] チェック ボックスをオンにします。 [保存] をクリックします。

  6. デバイスが接続されたときに Windows が更新されたデバイス メタデータを読み取るようにプリンターを再接続します。

デバイスのメンテナンス (v4 プリンター ドライバー)

v4 印刷ドライバー の開発

双方向通信

UWP アプリの使い始め方

UWP デバイス アプリを作成する (ステップ バイ ステップ ガイド)

UWP デバイス アプリのデバイス メタデータを作成する (ステップ バイ ステップ ガイド)