Bagikan melalui


Cara melakukan pemeliharaan printer di aplikasi perangkat UWP

Di Windows 8.1, aplikasi perangkat UWP dapat melakukan pemeliharaan printer, seperti menyelaraskan kepala cetak dan membersihkan nozzle. Topik 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 . Untuk bekerja dengan Bidi, sampel menggunakan pustaka ekstensi printer dalam proyek PrinterExtensionLibrary . Pustaka ekstensi printer menyediakan cara mudah untuk mengakses antarmuka ekstensi printer dari pengandar cetak v4. Untuk informasi selengkapnya, lihat Gambaran umum pustaka ekstensi Printer.

Nota

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

Pemeliharaan printer

Windows 8.1 memperkenalkan antarmuka ekstensi printer baru di driver printer v4 yang dapat Anda gunakan untuk menerapkan pemeliharaan perangkat: IPrinterBidiSetRequestCallback, IPrinterExtensionAsyncOperation , dan 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).

Petunjuk

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 topik ini).

Prasyarat

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. Lihat Memulai untuk informasi tentang mengunduh alat dan membuat akun pengembang.

  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. Lihat Membuat metadata perangkat untuk informasi selengkapnya tentang hal tersebut.

  5. Buat UI untuk halaman utama aplikasi Anda. Semua aplikasi perangkat UWP dapat diluncurkan dari Mulai, tempat aplikasi tersebut akan 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. Jika Anda menulis, Anda menulis aplikasi dengan C# atau JavaScript, tambahkan proyek PrinterExtensionLibrary ke solusi aplikasi perangkat UWP Anda. Anda dapat menemukan proyek ini dalam sampel Manajemen pekerjaan cetak dan pemeliharaan printer .

Nota

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. Untuk informasi selengkapnya tentang Bidi, lihat Komunikasi Dua Arah.

Contoh ini berasal dari OnNavigatedTo metode file DeviceMaintenance.xaml.cs .

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.

Contoh ini berasal dari EnumeratePrinters_Click metode file DeviceMaintenance.xaml.cs . 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);
    }
}

Petunjuk

Untuk informasi selengkapnya tentang PrinterEnumeration kelas dan PrinterInfo , lihat file PrinterEnumeration.cs .

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.

Contoh ini berasal dari SendBidiRequest_Click metode file DeviceMaintenance.xaml.cs .

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

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.

Contoh ini menunjukkan PrinterBidiSetRequestCallback definisi kelas dalam file DeviceMaintenance.xaml.cs .

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.

Contoh ini berasal dari OnBidiResponseReceived metode file DeviceMaintenance.xaml.cs .

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

Pengujian

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 topik Membuat metadata perangkat untuk aplikasi perangkat UWP Anda.

Nota

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 topik 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. Dari menu Alat , pilih Aktifkan Penandatanganan Pengujian.

  2. Mulai ulang komputer

  3. Bangun solusi dengan membuka file solusi (.sln). Tekan F7 atau buka Build-Build Solution dari menu atas setelah contoh selesai 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. Nota: Jika Anda belum membuat metadata perangkat, lihat Membuat metadata perangkat untuk aplikasi perangkat UWP Anda.

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

    2. Klik Edit Perangkat Metadata. Ini akan memungkinkan Anda mengedit paket metadata perangkat yang ada.

    3. Dalam kotak dialog Buka , temukan paket metadata perangkat yang terkait dengan aplikasi perangkat UWP Anda. (Ini memiliki ekstensi file devicemetadata-ms.)

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

    5. Jika aplikasi Anda mendaftar untuk pemberitahuan printer, isi kotak penangan pemberitahuan . Di EVENT ID, masukkan nama penanganan aktivitas cetak. Di Aset Peristiwa, masukkan nama file di mana kode tersebut berada.

    6. Setelah selesai, klik Berikutnya hingga Anda masuk ke halaman Selesai .

    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 . Lalu klik Simpan.

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

Pemeliharaan Perangkat (Driver Printer v4)

Mengembangkan driver cetak versi 4

Komunikasi Dua Arah

Mulai menggunakan aplikasi UWP

Membuat aplikasi perangkat UWP (panduan langkah demi langkah)

Membuat metadata perangkat untuk aplikasi perangkat UWP (panduan langkah demi langkah)