Comment gérer les travaux d’impression dans une application UWP pour périphérique

Dans Windows 8.1, les applications UWP pour périphériques destinées aux imprimantes peuvent gérer les travaux d’impression. Ce sujet utilise la version C# de l’exemple Gestion des travaux d’impression et maintenance de l’imprimante pour démontrer comment créer une vue des travaux d’impression, surveiller ces travaux et si nécessaire, annuler un travail. Pour en savoir plus sur les applications d’appareils UWP en général, veuillez consulter la rubrique Découverte des applications d’appareils UWP.

La version C# de l’exemple Gestion des travaux d’impression et maintenance de l’imprimante démontre la maintenance de l’imprimante avec le fichier DeviceMaintenance.xaml.cs dans le projet DeviceAppForPrinters2. Pour travailler avec Bidi, l’exemple utilise la bibliothèque d’extension d’imprimante dans le projet PrinterExtensionLibrary. La bibliothèque d’extension d’imprimante offre un moyen pratique d’accéder aux interfaces d’extension d’imprimante du pilote d’impression v4. Pour plus d’informations, veuillez consulter l’aperçu de la bibliothèque d’extension d’imprimante.

Les exemples de code présentés dans ce sujet sont basés sur la version C# de l’exemple Gestion des travaux d’impression et maintenance de l’imprimante. Cet exemple est également disponible en JavaScript et C++. Notez que comme C++ peut accéder directement à COM, la version C++ de l’exemple n’inclut pas de projets de bibliothèque de code. Téléchargez les exemples pour voir les dernières versions du code.

Gestion des travaux d’impression

Windows 8.1 introduit de nouvelles interfaces d’extension d’imprimante dans le pilote d’imprimante v4 que vous pouvez utiliser pour gérer les travaux d’impression : IPrinterQueue2, IPrinterQueueViewEvent, IPrinterQueueViewEvent, IPrintJob et IPrintJobCollection. Ces interfaces permettent de surveiller et d’annuler les travaux d’impression. Pour plus d’informations, veuillez consulter la section Gestion des travaux d’impression (pilote d’imprimante v4).

Les applications C# et JavaScript ne peuvent pas travailler directement avec les API COM. Si vous écrivez une application UWP pour périphérique en C# ou JavaScript, utilisez la bibliothèque d’extension d’imprimante pour accéder à ces interfaces (comme indiqué dans ce sujet).

Prérequis

Avant de commencer :

  1. Assurez-vous que votre imprimante est installée avec un pilote d’impression v4. Pour plus d’informations, veuillez consulter la section Développement de pilotes d’impression v4.

  2. Préparez votre PC de développement. Veuillez consulter la section Bien démarrer pour obtenir des informations sur le téléchargement des outils et la création d’un compte développeur.

  3. Associez votre application au magasin. Consultez la section Créer une application UWP pour périphérique pour obtenir des informations à ce sujet.

  4. Créez des métadonnées de périphérique pour votre imprimante qui l’associent à votre application. Veuillez consulter la section Créer des métadonnées de périphérique pour plus d’informations à ce sujet.

  5. Construisez l’interface utilisateur pour la page principale de votre application. Toutes les applications UWP pour périphériques peuvent être lancées à partir de Start, où elles seront affichées en plein écran. Utilisez l’expérience Start pour mettre en valeur votre produit ou services d’une manière qui correspond à la marque spécifique et aux caractéristiques de vos appareils. Il n’y a pas de restrictions spéciales sur le type de contrôles UI qu’elle peut utiliser. Pour bien démarrer avec la conception de l’expérience plein écran, consultez les principes de conception de Microsoft Store.

  6. Si vous écrivez votre application en C# ou JavaScript, ajoutez le projet PrinterExtensionLibrary à la solution de votre application UWP pour périphérique. Vous pouvez trouver ce projet dans l’exemple Gestion des travaux d’impression et maintenance de l’imprimante.

Comme C++ peut accéder directement à COM, les applications C++ n’ont pas besoin d’une bibliothèque séparée pour travailler avec le contexte de périphérique d’imprimante basé sur COM.

Étape 1 : Trouver l’imprimante

Avant que votre application puisse gérer les travaux d’impression, elle doit d’abord localiser l’imprimante ayant les travaux d’impression. Pour cela, l’exemple Gestion des travaux d’impression et maintenance de l’imprimante inclut une classe pratique nommée PrinterEnumeration (dans le fichier PrinterEnumeration.cs). Cette classe trouve toutes les imprimantes qui sont associées à votre application via des métadonnées de périphérique et retourne une liste d’objets PrinterInfo, qui contient les noms et les ID de périphérique pour chaque imprimante.

Cet exemple montre la méthode EnumeratePrinters_Click dans le fichier PrintJobManagement.xaml.cs. Il montre comment l’exemple utilise la classe PrinterEnumeration pour obtenir une liste des imprimantes associées.

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

Pour plus d’informations sur les classes PrinterEnumeration et PrinterInfo, voir le fichier PrinterEnumeration.cs.

Étape 2 : Obtenir la file d’attente de l’imprimante

Une fois que vous avez identifié l’imprimante ayant les travaux d’impression que vous souhaitez gérer, créez une vue des travaux d’impression, avec un objet basé sur l’interface IPrinterQueueView (définie dans le fichier PrinterExtensionTypes.cs du projet PrinterExtensionLibrary). Dans l’exemple Gestion des travaux d’impression et maintenance de l’imprimante, cet objet est nommé currentPrinterQueueView et est recréé chaque fois que la sélection de l’imprimante change.

Dans la méthode Printer_SelectionChanged, l’exemple utilise d’abord un objet PrinterInfo pour créer un objet de contexte d’extension d’imprimante nommé context. Ensuite, il utilise la méthode GetPrinterQueueView sur le context pour créer l’objet currentPrinterQueueView. Enfin, un gestionnaire d’événements est ajouté pour gérer l’événement OnChanged de currentPrinterQueueView.

Cet exemple montre la méthode Printer_SelectionChanged dans le fichier PrintJobManagement.xaml.cs. Il montre comment créer un objet de vue de file d’attente d’imprimante basé sur 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);
    }
}

De plus, chaque fois qu’il y a un changement dans la vue des travaux d’impression, un gestionnaire d’événements appelle la méthode OnPrinterQueueViewChanged. Cette méthode est responsable de relier à nouveau le PrintJobListBox avec une collection IEnumerable d’objets IPrintJob. La collection est passée à la méthode via l’objet PrinterQueueViewEventArgs, qui est défini dans le fichier PrinterExtensionTypes.cs.

Cet exemple montre la méthode OnPrinterQueueViewChanged dans le fichier 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;
        }
    });
}

Étape 3 : Afficher le statut du travail d’impression

Comme le PrintJobListBox est lié à une collection d’objets IPrintJob, afficher le statut d’un travail est assez simple. Le travail d’impression sélectionné est converti en un objet IPrintJob, puis les propriétés de cet objet sont utilisées pour remplir la TextBox PrintJobDetails.

Dans l’exemple Gestion des travaux d’impression et maintenance de l’imprimante, le statut du travail d’impression est affiché chaque fois qu’un travail d’impression différent est sélectionné. Cette mise à jour est prise en charge par la méthode PrintJob_SelectionChanged.

Cet exemple montre la méthode PrintJob_SelectionChanged dans le fichier PrintJobManagement.xaml.cs. Il montre comment afficher le statut d’un travail d’impression, basé sur un objet IPrintJob.

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

Pour aider à afficher la description du statut du travail d’impression, la méthode PrintJob_SelectionChanged utilise un dictionnaire statique, nommé printJobStatusDisplayNames, pour aider à afficher les descriptions du statut du travail dans un format de texte convivial pour l’utilisateur.

Cet exemple montre la classe DisplayablePrintJobStatus dans le fichier PrintJobManagement.xaml.cs. Cette classe contient les membres statiques utilisés par le PrintJob_SelectionChanged.

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

Étape 4 : Annuler le travail d’impression

De manière similaire à l’affichage du statut du travail d’impression, annuler un travail d’impression est assez simple lorsque vous avez un objet IPrintJob. La classe IPrintJob fournit une méthode RequestCancel qui initie l’annulation du travail d’impression correspondant. Ceci est démontré dans la méthode CancelPrintJob_Click de l’exemple.

Cet exemple montre la méthode CancelPrintJob_Click dans le fichier 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);
    }
}

Test

Avant de pouvoir tester votre application UWP pour périphérique, elle doit être liée à votre imprimante à l’aide de métadonnées de périphérique.

Vous avez besoin d’une copie du package de métadonnées de périphérique pour votre imprimante, pour y ajouter les informations de l’application de périphérique. Si vous n’avez pas de métadonnées de périphérique, vous pouvez les construire en utilisant l’Assistant de création de métadonnées de périphérique comme décrit dans le sujet Créer des métadonnées de périphérique pour votre application UWP pour périphérique.

Pour utiliser l’Assistant de création de métadonnées de périphérique, vous devez installer Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate, ou le SDK autonome pour Windows 8.1, avant de compléter la procédure de cette rubrique. L’installation de Microsoft Visual Studio Express pour Windows installe une version du SDK qui n’inclut pas l’assistant.

Les étapes suivantes construisent votre application et installent les métadonnées de périphérique.

  1. Activez la signature de test.

    1. Lancez l’Assistant de création de métadonnées de périphérique depuis %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, en double-cliquant sur DeviceMetadataWizard.exe

    2. Depuis le menu Outils, sélectionnez Activer la signature de test.

  2. Redémarrez l’ordinateur

  3. Construisez la solution en ouvrant le fichier de solution (.sln). Appuyez sur F7 ou allez dans Construire->Construire la solution depuis le menu supérieur après que l’exemple ait été chargé.

  4. Déconnectez et désinstallez l’imprimante. Cette étape est nécessaire pour que Windows lise les métadonnées de périphérique mises à jour la prochaine fois que le périphérique est détecté.

  5. Éditez et sauvegardez les métadonnées de périphérique. Pour lier l’application de périphérique à votre périphérique, vous devez associer l’application de périphérique à votre périphérique.

    Si vous n’avez pas encore créé vos métadonnées de périphérique, consultez Créer des métadonnées de périphérique pour votre application UWP pour périphérique.

    1. Si l’Assistant de création de métadonnées de périphérique n’est pas encore ouvert, lancez-le depuis %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, en double-cliquant sur DeviceMetadataWizard.exe.

    2. Cliquez sur Éditer les métadonnées de périphérique. Cela vous permettra d’éditer votre package de métadonnées de périphérique existant.

    3. Dans la boîte de dialogue Ouvrir, localisez le package de métadonnées de périphérique associé à votre application UWP pour périphérique. (Il a une extension de fichier devicemetadata-ms).

    4. Sur la page Spécifier les informations de l’application UWP pour périphérique, saisissez les informations de l’application Microsoft Store dans la boîte Application UWP pour périphérique. Cliquez sur Importer le fichier manifeste de l’application UWP pour entrer automatiquement le Nom du package, le Nom de l’éditeur, et l’ID de l’application UWP.

    5. Si votre application s’inscrit pour des notifications d’imprimante, remplissez la boîte Gestionnaires de notifications. Dans ID de l’événement, saisissez le nom du gestionnaire d’événements d’impression. Dans Actif de l’événement, saisissez le nom du fichier où ce code réside.

    6. Lorsque vous avez terminé, cliquez sur Suivant jusqu’à ce que vous arriviez à la page Terminer.

    7. Sur la page Revoir le package de métadonnées de périphérique, assurez-vous que tous les paramètres sont corrects et sélectionnez la case à cocher Copier le package de métadonnées de périphérique dans le magasin de métadonnées sur l’ordinateur local. Ensuite, cliquez sur Enregistrer.

  6. Reconnectez votre imprimante pour que Windows lise les métadonnées de périphérique mises à jour lorsque le périphérique est connecté.

Gestion des travaux (pilote d’imprimante v4)

Développement de pilotes d’impression v4

Communications bidirectionnelles

Bien démarrer avec les applications UWP

Créer une application UWP pour périphérique (guide pas à pas)

Créer des métadonnées de périphérique pour une application UWP pour périphérique (guide étape par étape)