Bagikan melalui


Cara melakukan pemeliharaan printer di aplikasi perangkat UWP

Important

Metadata perangkat tidak digunakan lagi dan akan dihapus dalam rilis Windows mendatang. Untuk informasi tentang penggantian fungsionalitas ini, lihat Metadata Kontainer Paket Driver.

Di Windows 8.1, aplikasi perangkat UWP dapat melakukan pemeliharaan printer, seperti menyelaraskan kepala cetak dan membersihkan nozzle. Artikel ini menggunakan versi C# dari sampel Manajemen pekerjaan cetak dan pemeliharaan printer untuk menunjukkan bagaimana komunikasi dua arah (Bidi) dapat digunakan untuk melakukan pemeliharaan perangkat tersebut. Untuk mempelajari selengkapnya tentang aplikasi perangkat UWP secara umum, lihat Mengenal aplikasi perangkat UWP.

Versi C# dari sampel Manajemen pekerjaan cetak dan pemeliharaan printer menunjukkan pemeliharaan printer dengan file DeviceMaintenance.xaml.cs dalam proyek DeviceAppForPrinters2 . To work with Bidi, the sample uses the printer extension library in the PrinterExtensionLibrary project. Pustaka ekstensi printer menyediakan cara mudah untuk mengakses antarmuka ekstensi printer dari pengandar cetak v4. Untuk informasi selengkapnya, lihat Gambaran umum pustaka ekstensi Printer.

Note

Contoh kode yang ditunjukkan dalam artikel ini didasarkan pada versi C# dari sampel Manajemen pekerjaan cetak dan pemeliharaan printer . Sampel ini juga tersedia di JavaScript dan C++. Karena C++ dapat mengakses COM secara langsung, versi C++ sampel tidak menyertakan proyek pustaka kode. Unduh sampel untuk melihat versi terbaru kode.

Printer maintenance

Windows 8.1 introduces new printer extension interfaces in the v4 printer driver that you can use for implementing device maintenance: IPrinterBidiSetRequestCallback, IPrinterExtensionAsyncOperation , and IPrinterQueue2. Antarmuka ini memungkinkan untuk mengirim permintaan Bidi secara asinkron ke monitor port sehingga dapat diterjemahkan ke dalam perintah khusus perangkat dan protokol, lalu dikirim ke printer. Untuk informasi selengkapnya, lihat Pemeliharaan Perangkat (Driver Printer v4).

Tip

Aplikasi C# dan JavaScript tidak dapat bekerja dengan API COM secara langsung. Jika Anda menulis aplikasi perangkat UWP C# atau JavaScript, gunakan pustaka ekstensi printer untuk mengakses antarmuka ini (seperti yang ditunjukkan dalam artikel ini).

Prerequisites

Sebelum Anda memulai:

  1. Pastikan pencetak Anda terinstal menggunakan pengandar cetak v4. Untuk informasi selengkapnya, lihat Mengembangkan driver cetak v4.

  2. Siapkan PC pengembangan Anda. See Getting started for info about downloading the tools and creating a developer account.

  3. Kaitkan aplikasi Anda dengan toko. Lihat Membuat aplikasi perangkat UWP untuk informasi tentang hal tersebut.

  4. Buat metadata perangkat untuk printer Anda yang mengaitkannya dengan aplikasi Anda. Untuk informasi selengkapnya, lihat Membuat metadata perangkat.

  5. Buat UI untuk halaman utama aplikasi Anda. Semua aplikasi perangkat UWP dapat diluncurkan dari Mulai, tempat aplikasi ditampilkan layar penuh. Gunakan pengalaman Mulai untuk menyoroti produk atau layanan Anda dengan cara yang cocok dengan merek dan fitur tertentu dari perangkat Anda. Tidak ada batasan khusus pada jenis kontrol UI yang dapat digunakannya. Untuk mulai menggunakan desain pengalaman layar penuh, lihat prinsip desain Microsoft Store.

  6. If you're writing your app with C# or JavaScript, add the PrinterExtensionLibrary project to your UWP device app solution. Anda dapat menemukan proyek ini dalam sampel Manajemen pekerjaan cetak dan pemeliharaan printer .

Note

Karena C++ dapat mengakses COM secara langsung, aplikasi C++ tidak memerlukan pustaka terpisah untuk bekerja dengan konteks perangkat printer berbasis COM.

Langkah 1: Siapkan permintaan Bidi

Antarmuka pemeliharaan perangkat mengharuskan permintaan Bidi Anda adalah data XML dalam bentuk string. Anda dapat membuat permintaan Bidi secara masuk akal di mana saja dalam aplikasi Anda. Misalnya, Anda dapat menyimpan permintaan Bidi sebagai konstanta string atau membuatnya secara dinamis berdasarkan input pengguna. Sampel Manajemen pekerjaan cetak dan pemeliharaan printer kebetulan membuat permintaan default menggunakan metode OnNavigatedTo. For more info about Bidi, see Bidirectional Communications.

This example is from the OnNavigatedTo method of the DeviceMaintenance.xaml.cs file.

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>";

Langkah 2: Temukan printer

Sebelum aplikasi Anda dapat mengirim perintah ke pencetak, aplikasi harus terlebih dahulu menemukan printer. Untuk melakukan ini, sampel Manajemen pekerjaan cetak dan pemeliharaan printer menyertakan kelas bernama PrinterEnumeration (dalam file PrinterEnumeration.cs ). Kelas ini menemukan semua printer yang terkait dengan aplikasi Anda melalui metadata perangkat, dan mengembalikan daftar PrinterInfo objek, yang berisi nama dan ID perangkat untuk setiap printer.

This example is from the EnumeratePrinters_Click method of the DeviceMaintenance.xaml.cs file. Ini menunjukkan bagaimana sampel menggunakan PrinterEnumeration kelas untuk mendapatkan daftar printer terkait.

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);
    }
}

Tip

For more info about the PrinterEnumeration and PrinterInfo classes, see the PrinterEnumeration.cs file.

Langkah 3: Kirim permintaan Bidi

Untuk mengirim permintaan Bidi, antarmuka pemeliharaan perangkat memerlukan string Bidi dan panggilan balik. Dalam metode SendBidiRequest_Click, sampel pertama-tama menggunakan objek PrinterInfo untuk membuat objek konteks ekstensi printer bernama context. Kemudian objek PrinterBidiSetRequestCallback dibuat, dan penanganan aktivitas ditambahkan untuk menangani peristiwa panggilan balik OnBidiResponseReceived . Terakhir, metode SendBidiSetRequestAsync dalam konteks ekstensi printer digunakan untuk mengirim string Bidi dan pemanggilan balik.

This example is from the SendBidiRequest_Click method of the DeviceMaintenance.xaml.cs file.

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);

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

Langkah 4: Menerima respons Bidi

Ketika operasi "set" Bidi selesai, objek panggilan balik, jenis PrinterBidiSetRequestCallback, dipanggil. Panggilan balik ini mengurus penanganan kesalahan dari respons HRESULT dan kemudian memicu OnBidiResponseReceived peristiwa, mengirim respons Bidi melalui parameter peristiwa.

This example shows the PrinterBidiSetRequestCallback class definition in the DeviceMaintenance.xaml.cs file.

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;
}

Respons Bidi kemudian dikirim ke metode OnBidiResponseReceived, di mana Dispatcher digunakan untuk menampilkan hasil di thread UI.

This example is from the OnBidiResponseReceived method of the DeviceMaintenance.xaml.cs file.

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

Testing

Sebelum dapat menguji aplikasi perangkat UWP, aplikasi tersebut harus ditautkan ke printer Anda menggunakan metadata perangkat.

Anda memerlukan salinan paket metadata perangkat untuk printer Anda, untuk menambahkan info aplikasi perangkat ke dalamnya. Jika Anda tidak memiliki metadata perangkat, Anda dapat membuatnya menggunakan Wizard Penulisan Metadata Perangkat seperti yang dijelaskan dalam artikel Membuat metadata perangkat untuk aplikasi perangkat UWP Anda.

Note

Untuk menggunakan Wizard Penulisan Metadata Perangkat, Anda harus menginstal Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate, atau SDK mandiri untuk Windows 8.1, sebelum menyelesaikan langkah-langkah dalam artikel ini. Menginstal Microsoft Visual Studio Express untuk Windows menginstal versi SDK yang tidak menyertakan wizard.

Langkah-langkah berikut membuat aplikasi Anda dan menginstal metadata perangkat.

  1. Aktifkan tanda tangan uji.

    1. Mulai Wizard Penulisan Metadata Perangkat dari %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, dengan mengklik dua kali DeviceMetadataWizard.exe

    2. From the Tools menu, select Enable Test Signing.

  2. Mulai ulang komputer

  3. Bangun solusi dengan membuka file solusi (.sln). Tekan F7 atau buka Solusi Build-Build> dari menu atas setelah sampel dimuat.

  4. Putuskan sambungan dan copot pemasangan printer. Langkah ini diperlukan agar Windows akan membaca metadata perangkat yang diperbarui saat perangkat terdeteksi berikutnya.

  5. Edit dan simpan metadata perangkat. Untuk menautkan aplikasi perangkat ke perangkat, Anda harus mengaitkan aplikasi perangkat dengan perangkat Anda. Jika metadata perangkat Anda belum dibuat, lihat Membuat metadata perangkat untuk aplikasi perangkat UWP Anda.

    1. Jika Wizard Penulisan Metadata Perangkat belum terbuka, mulai dari %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, dengan mengklik dua kali DeviceMetadataWizard.exe.

    2. Pilih Edit Metadata Perangkat. Opsi ini memungkinkan Anda mengedit paket metadata perangkat yang ada.

    3. In the Open dialog box, locate the device metadata package associated with your UWP device app. (It has a devicemetadata-ms file extension.)

    4. Pada halaman Tentukan informasi aplikasi perangkat UWP , masukkan info aplikasi Microsoft Store di kotak aplikasi perangkat UWP . Pilih Impor file manifes aplikasi UWP untuk secara otomatis memasukkan Nama paket, Nama penerbit, dan ID aplikasi UWP.

    5. If your app is registering for printer notifications, fill out the Notification handlers box. In Event ID, enter the name of the print event handler. In Event Asset, enter the name of the file where that code resides.

    6. When you're done, select Next until you get to the Finish page.

    7. Pada halaman Tinjau paket metadata perangkat , pastikan semua pengaturan sudah benar dan pilih kotak centang Salin paket metadata perangkat ke penyimpanan metadata di komputer lokal . Then select Save.

  6. Sambungkan kembali pencetak Anda agar Windows membaca metadata perangkat yang diperbarui ketika perangkat tersambung.