Share via


Come eseguire la manutenzione della stampante in un'app per dispositivi UWP

In Windows 8.1, le app per dispositivi UWP possono eseguire la manutenzione della stampante, ad esempio l'allineamento delle teste di stampa e degli ugelli di pulizia. In questo argomento viene usata la versione C# dell'esempio di gestione dei processi di stampa e manutenzione della stampante per illustrare come usare la comunicazione bidirezionale (Bidi) per eseguire tale manutenzione del dispositivo. Per altre informazioni sulle app per dispositivi UWP in generale, vedi Soddisfare le app per dispositivi UWP.

La versione C# dell'esempio di gestione dei processi di stampa e manutenzione della stampante illustra la manutenzione della stampante con il file DeviceMaintenance.xaml.cs nel progetto DeviceAppForPrinters2 . Per lavorare con Bidi, l'esempio usa la libreria di estensioni della stampante nel progetto PrinterExtensionLibrary . La libreria di estensioni della stampante offre un modo pratico per accedere alle interfacce di estensione della stampante del driver di stampa v4. Per altre info, vedi Panoramica della libreria di estensioni della stampante.

Nota

Gli esempi di codice illustrati in questo argomento si basano sulla versione C# dell'esempio di gestione dei processi di stampa e manutenzione della stampante. Questo esempio è disponibile anche in JavaScript e C++. Si noti che poiché C++ può accedere direttamente a COM, la versione C++ dell'esempio non include progetti di libreria di codice. Scaricare gli esempi per visualizzare le versioni più recenti del codice.

Manutenzione stampante

Windows 8.1 introduce nuove interfacce di estensione della stampante nel driver della stampante v4 che è possibile usare per implementare la manutenzione del dispositivo: IPrinterBidiSetRequestCallback, IPrinterExtensionAsyncOperation e IPrinterQueue2. Queste interfacce consentono di inviare in modo asincrono richieste Bidi al monitor della porta in modo che possano essere convertite in comandi specifici del dispositivo e del protocollo e quindi inviate alla stampante. Per altre info, vedi Manutenzione del dispositivo (driver della stampante v4).For more info, see Device Maintenance (v4 Printer Driver).

Suggerimento

Le app C# e JavaScript non possono funzionare direttamente con le API COM. Se stai scrivendo un'app per dispositivi UWP C# o JavaScript, usa la libreria di estensioni della stampante per accedere a queste interfacce (come illustrato in questo argomento).

Prerequisiti

Prima di iniziare:

  1. Assicurarsi che la stampante sia installata usando un driver di stampa v4. Per altre informazioni, vedi Sviluppo di driver di stampa v4.

  2. Configurare il PC di sviluppo. Vedi Introduzione per informazioni sul download degli strumenti e sulla creazione di un account per sviluppatore.

  3. Associare l'app allo Store. Per informazioni su questo, vedi Creare un'app per dispositivi UWP.

  4. Creare i metadati del dispositivo per la stampante che la associa all'app. Per altre informazioni, vedere Creare metadati del dispositivo.

  5. Compilare l'interfaccia utente per la pagina principale dell'app. Tutte le app per dispositivi UWP possono essere avviate dalla schermata Start, in cui verranno visualizzate a schermo intero. Usa l'esperienza Start per evidenziare il tuo prodotto o i tuoi servizi in modo che corrisponda alla personalizzazione e alle funzionalità specifiche dei tuoi dispositivi. Non esistono restrizioni speciali per il tipo di controlli dell'interfaccia utente che può usare. Per iniziare a usare la progettazione dell'esperienza a schermo intero, vedere i principi di progettazione di Microsoft Store.

  6. Se stai scrivendo la tua app con C# o JavaScript, aggiungi il progetto PrinterExtensionLibrary alla soluzione di app per dispositivi UWP. È possibile trovare questo progetto nell'esempio di gestione dei processi di stampa e manutenzione della stampante.

Nota

Poiché C++ può accedere direttamente a COM, le app C++ non richiedono una libreria separata per funzionare con il contesto di dispositivo della stampante basato su COM.

Passaggio 1: Preparare la richiesta Bidi

Le interfacce di manutenzione del dispositivo richiedono che le richieste Bidi siano dati XML sotto forma di stringa. Puoi costruire le richieste Bidi ovunque abbia senso nella tua app. Ad esempio, è possibile salvare le richieste Bidi come costanti stringa o crearle in modo dinamico in base all'input dell'utente. L'esempio di gestione dei processi di stampa e manutenzione della stampante viene eseguito per costruire una richiesta predefinita nel OnNavigatedTo metodo . Per altre info su Bidi, vedi Comunicazioni bidirezionali.

Questo esempio proviene dal OnNavigatedTo metodo del 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>";

Passaggio 2: Trovare la stampante

Prima che l'app possa inviare comandi alla stampante, deve prima individuare la stampante. A tale scopo, l'esempio di gestione dei processi di stampa e manutenzione della stampante include una classe denominata PrinterEnumeration (nel file PrinterEnumeration.cs ). Questa classe trova tutte le stampanti associate all'app tramite i metadati del dispositivo e restituisce un elenco di PrinterInfo oggetti, che contiene i nomi e gli ID dispositivo per ogni stampante.

Questo esempio proviene dal EnumeratePrinters_Click metodo del file DeviceMaintenance.xaml.cs . Mostra come l'esempio usa la PrinterEnumeration classe per ottenere un elenco di stampanti associate.

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

Suggerimento

Per altre info sulle PrinterEnumeration classi e PrinterInfo , vedi il file PrinterEnumeration.cs .

Passaggio 3: Inviare una richiesta Bidi

Per inviare la richiesta Bidi, le interfacce di manutenzione del dispositivo richiedono una stringa Bidi e un callback. SendBidiRequest_Click Nel metodo , l'esempio usa innanzitutto un oggetto per creare un PrinterInfo oggetto contesto di estensione della stampante denominato context. Viene quindi creato un PrinterBidiSetRequestCallback oggetto e viene aggiunto un gestore eventi per gestire l'evento del OnBidiResponseReceived callback. Infine, il metodo del contesto dell'estensione della SendBidiSetRequestAsync stampante viene usato per inviare la stringa Bidi e il callback.

Questo esempio proviene dal SendBidiRequest_Click metodo del 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);
    }
}

Passaggio 4: Ricevere la risposta Bidi

Al termine dell'operazione Bidi "set", viene richiamato l'oggetto callback, di tipo PrinterBidiSetRequestCallback, . Questo callback si occupa della gestione degli errori dalla risposta HRESULT e quindi attiva l'evento, inviando la risposta Bidi tramite i parametri dell'evento OnBidiResponseReceived .

In questo esempio viene illustrata la definizione della PrinterBidiSetRequestCallback classe nel 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;
}

La risposta Bidi viene quindi inviata al OnBidiResponseReceived metodo , in cui Dispatcher viene usato per visualizzare i risultati nel thread dell'interfaccia utente.

Questo esempio proviene dal OnBidiResponseReceived metodo del file DeviceMaintenance.xaml.cs .

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

Test in corso

Prima di poter testare l'app per dispositivi UWP, deve essere collegata alla stampante usando i metadati del dispositivo.

È necessaria una copia del pacchetto di metadati del dispositivo per la stampante per aggiungere le informazioni sull'app del dispositivo. Se non hai metadati del dispositivo, puoi compilarlo usando la Creazione guidata metadati dispositivo come descritto nell'argomento Creare metadati del dispositivo per l'app per dispositivi UWP.

Nota

Per usare la Creazione guidata metadati dispositivo, è necessario installare Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate o l'SDK autonomo per Windows 8.1, prima di completare i passaggi descritti in questo argomento. L'installazione di Microsoft Visual Studio Express per Windows installa una versione dell'SDK che non include la procedura guidata.

La procedura seguente consente di compilare l'app e installare i metadati del dispositivo.

  1. Abilitare la firma di test.

    1. Avviare la Creazione guidata metadati dispositivo da %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86 facendo doppio clic su DeviceMetadataWizard.exe

    2. Scegliere Abilita firma test dal menu Strumenti.

  2. Riavviare il computer

  3. Compilare la soluzione aprendo il file della soluzione (.sln). Premere F7 o passare a Compila soluzione> dal menu in alto dopo il caricamento dell'esempio.

  4. Disconnettere e disinstallare la stampante. Questo passaggio è obbligatorio in modo che Windows leggerà i metadati aggiornati del dispositivo alla successiva individuazione del dispositivo.

  5. Modificare e salvare i metadati del dispositivo. Per collegare l'app del dispositivo al dispositivo, devi associare l'app per dispositivo al dispositivo. Nota: se non hai ancora creato i metadati del dispositivo, vedi Creare metadati del dispositivo per l'app per dispositivi UWP.

    1. Se la Creazione guidata metadati dispositivo non è ancora aperta, avviarla da %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86 facendo doppio clic su DeviceMetadataWizard.exe.

    2. Fare clic su Modifica metadati dispositivo. In questo modo sarà possibile modificare il pacchetto di metadati del dispositivo esistente.

    3. Nella finestra di dialogo Apri individuare il pacchetto di metadati del dispositivo associato all'app per dispositivi UWP. Ha un'estensione di file devicemetadata-ms .

    4. Nella pagina Specificare le informazioni sull'app per dispositivi UWP immettere le informazioni sull'app di Microsoft Store nella casella app per dispositivi UWP. Fare clic su Importa file manifesto dell'app UWP per immettere automaticamente il nome del pacchetto, il nome dell'editore e l'ID app UWP.

    5. Se l'app sta registrando per le notifiche della stampante, compilare la casella Gestori di notifica. In ID evento immettere il nome del gestore eventi di stampa. In Asset evento immettere il nome del file in cui risiede il codice.

    6. Al termine, fare clic su Avanti finché non si arriva alla pagina Fine .

    7. Nella pagina Rivedi il pacchetto di metadati del dispositivo verificare che tutte le impostazioni siano corrette e selezionare la casella di controllo Copia il pacchetto di metadati del dispositivo nell'archivio metadati nel computer locale. Fare clic su Save (Salva).

  6. Riconnettere la stampante in modo che Windows legga i metadati aggiornati del dispositivo quando il dispositivo è connesso.

Manutenzione dei dispositivi (driver della stampante v4)

Sviluppo di driver di stampa v4

Comunicazioni bidirezionali

Introduzione alle app UWP

Creare un'app per dispositivi UWP (guida dettagliata)

Creare metadati del dispositivo per un'app per dispositivi UWP (guida dettagliata)