Bagikan melalui


Cara mengelola pekerjaan cetak di aplikasi perangkat UWP

Di Windows 8.1, aplikasi perangkat UWP untuk printer dapat mengelola pekerjaan cetak. Topik ini menggunakan versi C# dari sampel Manajemen pekerjaan cetak dan pemeliharaan printer untuk menunjukkan cara membuat tampilan pekerjaan cetak, memantau pekerjaan tersebut, dan jika perlu, membatalkan pekerjaan. 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.

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.

Mengelola pekerjaan cetak

Windows 8.1 memperkenalkan antarmuka ekstensi printer baru di driver printer v4 yang dapat Anda gunakan untuk mengelola pekerjaan cetak: IPrinterQueue2, IPrinterQueueView, IPrinterQueueViewEvent, IPrintJob, dan IPrintJobCollection. Antarmuka ini memungkinkan untuk memantau dan membatalkan pekerjaan cetak. Untuk informasi selengkapnya, lihat Manajemen pekerjaan cetak (Driver Printer v4).

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 .

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

Langkah 1: Temukan printer

Sebelum aplikasi Anda dapat mengelola pekerjaan cetak, aplikasi harus terlebih dahulu menemukan printer yang memiliki pekerjaan cetak. Untuk melakukan ini, sampel Manajemen pekerjaan cetak dan pemeliharaan printer menyertakan kelas berguna 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 menunjukkan metode EnumeratePrinters_Click dalam file PrintJobManagement.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);
    }
}

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

Langkah 2: Akses antrean printer

Setelah Anda mengidentifikasi printer yang memiliki pekerjaan cetak yang ingin Anda kelola, buat tampilan pekerjaan cetak, dengan objek berdasarkan IPrinterQueueView antarmuka (ditentukan dalam file PrinterExtensionTypes.cs proyek PrinterExtensionLibrary ). Dalam sampel Manajemen pekerjaan cetak dan pemeliharaan printer , objek ini diberi nama currentPrinterQueueView dan dibuat ulang setiap kali pilihan printer berubah.

Dalam metode Printer_SelectionChanged, sampel pertama-tama menggunakan objek PrinterInfo untuk membuat objek konteks ekstensi printer bernama context. Kemudian menggunakan GetPrinterQueueView metode pada context untuk membuat currentPrinterQueueView objek. Terakhir, pengendali acara ditambahkan untuk menangani acara currentPrinterQueueViewOnChanged.

Contoh ini menunjukkan metode Printer_SelectionChanged menggunakan file PrintJobManagement.xaml.cs. Ini menunjukkan cara membuat objek tampilan antrean printer berdasarkan IPrinterQueueView.

private void Printer_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    try
    {
        // Remove the current printer queue view (if any) before displaying the new view.
        if (currentPrinterQueueView != null)
        {
            currentPrinterQueueView.OnChanged -= OnPrinterQueueViewChanged;
            currentPrinterQueueView = null;
        }

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

        // Display the printer queue view.
        const int FirstPrintJobEnumerated = 0;
        const int LastPrintJobEnumerated = 10;

        currentPrinterQueueView = context.Queue.GetPrinterQueueView(FirstPrintJobEnumerated, LastPrintJobEnumerated);
        currentPrinterQueueView.OnChanged += OnPrinterQueueViewChanged;
    }
    catch (Exception exception)
    {
        rootPage.NotifyUser("Caught an exception: " + exception.Message, NotifyType.ErrorMessage);
    }
}

Selain itu, setiap kali ada perubahan pada tampilan pekerjaan cetak, penanganan aktivitas memanggil OnPrinterQueueViewChanged metode . Metode ini bertanggung jawab untuk mengikat PrintJobListBox ulang dengan kumpulan IPrintJob objek yang dapat diubah IEnumerable. Koleksi diteruskan ke metode melalui PrinterQueueViewEventArgs objek , yang didefinisikan dalam file PrinterExtensionTypes.cs .

Contoh ini menunjukkan metode OnPrinterQueueViewChanged dalam file PrintJobManagement.xaml.cs.

private async void OnPrinterQueueViewChanged(object sender, PrinterQueueViewEventArgs e)
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        // Update the data binding on the ListBox that displays print jobs.
        PrintJobListBox.ItemsSource = e.Collection;
        if (PrintJobListBox.Items.Count > 0)
        {
            // If there are print jobs in the current view, mark the first job as selected.
            PrintJobListBox.SelectedIndex = 0;
        }
    });
}

Langkah 3: Tampilkan status pekerjaan cetak

PrintJobListBox Karena terikat ke kumpulan IPrintJob objek, menampilkan status pekerjaan cukup mudah. Tugas cetak yang dipilih dilemparkan sebagai IPrintJob objek, lalu properti objek tersebut digunakan untuk mengisi PrintJobDetails Kotak Teks.

Dalam sampel Manajemen pekerjaan cetak dan pemeliharaan printer , status pekerjaan cetak ditampilkan setiap kali pekerjaan cetak yang berbeda dipilih. Pembaruan ini ditangani oleh metode PrintJob_SelectionChanged.

Contoh ini menunjukkan metode PrintJob_SelectionChanged dalam PrintJobManagement.xaml.cs. Ini menunjukkan cara menampilkan status pekerjaan cetak, berdasarkan IPrintJob objek.

private void PrintJob_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    try
    {
        // Display details of the selected print job.
        IPrintJob job = (IPrintJob)PrintJobListBox.SelectedItem;
        if (job != null)
        {
            PrintJobDetails.Text =
                "Details of print job: " + job.Name + "\r\n" +
                "Pages printed: " + job.PrintedPages + "/" + job.TotalPages + "\r\n" +
                "Submission time: " + job.SubmissionTime + "\r\n" +
                "Job status: " + DisplayablePrintJobStatus.ToString(job.Status);
        }
        else
        {
            PrintJobDetails.Text = "Please select a print job";
        }
    }
    catch (Exception exception)
    {
        rootPage.NotifyUser("Caught an exception: " + exception.Message, NotifyType.ErrorMessage);
    }
}

Untuk membantu menampilkan deskripsi status pekerjaan cetak, PrintJob_SelectionChanged metode menggunakan kamus statis, bernama printJobStatusDisplayNames, untuk membantu menampilkan deskripsi status pekerjaan yang dalam format teks yang mudah digunakan.

Contoh ini menunjukkan DisplayablePrintJobStatus kelas dalam file PrintJobManagement.xaml.cs . Kelas ini berisi anggota statis PrintJob_SelectionChanged yang digunakan oleh.

internal class DisplayablePrintJobStatus
{
    /// <summary>
    /// Converts the PrintJobStatus bit fields to a display string.
    /// </summary>
    internal static string ToString(PrintJobStatus printJobStatus)
    {
        StringBuilder statusString = new StringBuilder();

        // Iterate through each of the PrintJobStatus bits that are set and convert it to a display string.
        foreach (var printJobStatusDisplayName in printJobStatusDisplayNames)
        {
            if ((printJobStatusDisplayName.Key & printJobStatus) != 0)
            {
                statusString.Append(printJobStatusDisplayName.Value);
            }
        }

        int stringlen = statusString.Length;
        if (stringlen > 0)
        {
            // Trim the trailing comma from the string.
            return statusString.ToString(0, stringlen - 1);
        }
        else
        {
            // If no print job status field was set, display "Not available".
            return "Not available";
        }
    }

    /// <summary>
    /// Static constructor that initializes the display name for the PrintJobStatus field.
    /// </summary>
    static DisplayablePrintJobStatus()
    {
        printJobStatusDisplayNames = new Dictionary<PrintJobStatus, string>();

        printJobStatusDisplayNames.Add(PrintJobStatus.Paused, "Paused,");
        printJobStatusDisplayNames.Add(PrintJobStatus.Error, "Error,");
        printJobStatusDisplayNames.Add(PrintJobStatus.Deleting, "Deleting,");
        printJobStatusDisplayNames.Add(PrintJobStatus.Spooling, "Spooling,");
        printJobStatusDisplayNames.Add(PrintJobStatus.Printing, "Printing,");
        printJobStatusDisplayNames.Add(PrintJobStatus.Offline, "Offline,");
        printJobStatusDisplayNames.Add(PrintJobStatus.PaperOut, "Out of paper,");
        printJobStatusDisplayNames.Add(PrintJobStatus.Printed, "Printed,");
        printJobStatusDisplayNames.Add(PrintJobStatus.Deleted, "Deleted,");
        printJobStatusDisplayNames.Add(PrintJobStatus.BlockedDeviceQueue, "Blocked device queue,");
        printJobStatusDisplayNames.Add(PrintJobStatus.UserIntervention, "User intervention required,");
        printJobStatusDisplayNames.Add(PrintJobStatus.Restarted, "Restarted,");
        printJobStatusDisplayNames.Add(PrintJobStatus.Complete, "Complete,");
        printJobStatusDisplayNames.Add(PrintJobStatus.Retained, "Retained,");
    }
    
    /// <summary>
    /// Private constructor to prevent default instantiation.
    /// </summary>
    private DisplayablePrintJobStatus() { }

    /// <summary>
    /// Contains the mapping between PrintJobStatus fields and display strings.
    /// </summary>
    private static Dictionary<PrintJobStatus, string> printJobStatusDisplayNames;
}

Langkah 4: Batalkan pekerjaan cetak

Mirip dengan menampilkan status pekerjaan cetak, membatalkan pekerjaan cetak cukup mudah ketika Anda memiliki IPrintJob objek. Kelas IPrintJob menawarkan metode RequestCancel yang memulai pembatalan pekerjaan cetak terkait. Metode CancelPrintJob_Click dalam sampel ini menunjukkan hal tersebut.

Contoh ini menunjukkan metode CancelPrintJob_Click pada file PrintJobManagement.xaml.cs.

private void CancelPrintJob_Click(object sender, RoutedEventArgs e)
{
    try
    {
        IPrintJob job = (IPrintJob)PrintJobListBox.SelectedItem;
        job.RequestCancel();
    }
    catch (Exception exception)
    {
        rootPage.NotifyUser("Caught an exception: " + exception.Message, NotifyType.ErrorMessage);
    }
}

Uji coba

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.

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 > 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.

    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.

Manajemen Pekerjaan (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)