Så här utför du skrivarunderhåll i en UWP-enhetsapp
I Windows 8.1 kan UWP-enhetsappar utföra skrivarunderhåll, till exempel justera utskriftshuvuden och rengöra munstycken. Det här avsnittet använder exemplet på C#-versionen av Utskriftsjobbhantering och skrivarunderhåll för att visa hur dubbelriktad kommunikation (Bidi) kan användas för att utföra underhåll på sådana enheter. Mer information om UWP-enhetsappar i allmänhet finns i Meet UWP device apps.
C#-versionen av Utskriftsjobbhantering och skrivarunderhåll exempel visar skrivarunderhåll med DeviceMaintenance.xaml.cs-filen i DeviceAppForPrinters2-projektet. För att arbeta med Bidi använder exemplet skrivartilläggsbiblioteket i projektet PrinterExtensionLibrary. Skrivartilläggsbiblioteket är ett bekvämt sätt att komma åt skrivartilläggsgränssnitten för v4-utskriftsdrivrutinen. För mer information, se översikten av biblioteket för skrivartillägg .
Anmärkning
Kodexemplen som visas i det här avsnittet baseras på C#-versionen av Utskriftsjobbhantering och skrivarunderhåll exempel. Det här exemplet är också tillgängligt i JavaScript och C++. Observera att eftersom C++ kan komma åt COM direkt innehåller C++-versionen av exemplet inte kodbiblioteksprojekt. Ladda ned exemplen för att se de senaste versionerna av koden.
Skrivarunderhåll
Windows 8.1 introducerar nya gränssnitt för skrivartillägg i den v4-skrivardrivrutin som du kan använda för att implementera enhetsunderhåll: IPrinterBidiSetRequestCallback, IPrinterExtensionAsyncOperation och IPrinterQueue2. Dessa gränssnitt gör det möjligt att asynkront skicka Bidi-begäranden till portövervakaren så att de kan översättas till enhets- och protokollspecifika kommandon och sedan skickas till skrivaren. Mer information finns i Enhetsunderhåll (v4-skrivardrivrutin).
Tips
C#- och JavaScript-appar kan inte fungera direkt med COM-API:er. Om du skriver en C#- eller JavaScript UWP-enhetsapp använder du skrivartilläggsbiblioteket för att få åtkomst till dessa gränssnitt (som du ser i det här avsnittet).
Förutsättningar
Innan du börjar:
Kontrollera att skrivaren är installerad med en v4-utskriftsdrivrutin. Mer information finns i Utveckla v4-utskriftsdrivrutiner.
Konfigurera din utvecklingsdator. Se Komma igång för information om hur du laddar ned verktygen och skapar ett utvecklarkonto.
Associera din app med butiken. Mer information om det finns i Skapa en UWP-enhetsapp.
Skapa enhetsmetadata för skrivaren som associerar den med din app. Mer information finns i Skapa enhetsmetadata.
Skapa användargränssnittet för appens huvudsida. Alla UWP-enhetsappar kan startas från Start, där de visas i helskärmsläge. Använd Start-upplevelsen för att markera din produkt eller dina tjänster på ett sätt som matchar de specifika varumärkesanpassningarna och funktionerna på dina enheter. Det finns inga särskilda begränsningar för vilken typ av användargränssnittskontroller som kan användas. Information om hur du kommer igång med utformningen av helskärmsmiljön finns i Designprinciper för Microsoft Store.
Om du skriver din app med C# eller JavaScript, lägger du till projektet PrinterExtensionLibrary i din UWP-enhetsapplösning. Du hittar det här projektet i utskriftsjobbhantering och skrivarunderhåll exempel.
Anmärkning
Eftersom C++ kan komma åt COM direkt kräver C++-appar inte ett separat bibliotek för att fungera med COM-baserad skrivarenhetskontext.
Steg 1: Förbereda Bidi-begäran
Gränssnitten för enhetsunderhåll kräver att dina Bidi-begäranden är XML-data i form av en sträng. Du kan skapa dina Bidi-begäranden var det än passar i din app. Du kan till exempel spara Bidi-begäranden som strängkonstanter eller dynamiskt skapa dem baserat på användarindata. Det utskriftsjobbhantering och skrivarunderhåll exempel råkar konstruera en standardbegäran i OnNavigatedTo
metod. Mer information om Bidi finns i Dubbelriktad kommunikation.
Det här exemplet kommer från OnNavigatedTo
-metoden för DeviceMaintenance.xaml.cs-filen.
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>";
Steg 2: Hitta skrivare
Innan appen kan skicka kommandon till skrivaren måste den först leta upp skrivaren. För att göra detta innehåller exemplet för utskriftsjobbhantering och skrivarunderhåll en klass med namnet PrinterEnumeration
(i filen PrinterEnumeration.cs). Den här klassen hittar alla skrivare som är associerade med din app via enhetsmetadata och returnerar en lista över PrinterInfo
objekt som innehåller namn och enhets-ID:n för varje skrivare.
Det här exemplet kommer från EnumeratePrinters_Click
-metoden för DeviceMaintenance.xaml.cs-filen. Den visar hur exemplet använder klassen PrinterEnumeration
för att hämta en lista över associerade skrivare.
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);
}
}
Tips
Mer information om klasserna PrinterEnumeration
och PrinterInfo
finns i filen PrinterEnumeration.cs.
Steg 3: Skicka Bidi-begäran
För att skicka Bidi-begäran kräver enhetsunderhållsgränssnitten en Bidi-sträng och ett återanrop. I metoden SendBidiRequest_Click
använder exemplet först ett PrinterInfo
-objekt för att skapa ett kontextobjekt för skrivartillägg med namnet context
. Sedan skapas ett PrinterBidiSetRequestCallback
objekt och en händelsehanterare läggs till för att hantera motringningens OnBidiResponseReceived
händelse. Slutligen används skrivartilläggskontextens SendBidiSetRequestAsync
-metod för att skicka Bidi-strängen och återanropet.
Det här exemplet kommer från SendBidiRequest_Click
-metoden för DeviceMaintenance.xaml.cs-filen.
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);
}
}
Steg 4: Ta emot Bidi-svar
När bidi-åtgärden "set" har slutförts anropas återkallaningsobjektet, av typen PrinterBidiSetRequestCallback
. Det här återanropet tar hand om felhanteringen från HRESULT-svaret och utlöser sedan händelsen OnBidiResponseReceived
och skickar Bidi-svaret via händelseparametrarna.
Det här exemplet visar PrinterBidiSetRequestCallback
-klassdefinitionen i filen 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;
}
Bidi-svaret skickas sedan till metoden OnBidiResponseReceived
, där Dispatcher
används för att visa resultatet i användargränssnittstråden.
Det här exemplet kommer från OnBidiResponseReceived
-metoden för DeviceMaintenance.xaml.cs-filen.
internal async void OnBidiResponseReceived(object sender, string bidiResponse)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
BidiResponseOutput.Text = bidiResponse;
});
}
Testa
Innan du kan testa UWP-enhetsappen måste den länkas till skrivaren med enhetsmetadata.
Du behöver en kopia av enhetens metadatapaket för skrivaren för att lägga till information om enhetsappen i den. Om du inte har enhetsmetadata kan du skapa dem med hjälp av guiden Redigera enhetsmetadata enligt beskrivningen i avsnittet Skapa enhetsmetadata för UWP-enhetsappen.
Anmärkning
Om du vill använda guiden enhetsmetadataredigeringmåste du installera Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate eller fristående SDK för Windows 8.1innan du slutför stegen i det här avsnittet. När du installerar Microsoft Visual Studio Express för Windows installeras en version av SDK:t som inte innehåller guiden.
Följande steg skapar din app och installerar enhetens metadata.
Aktivera testsignering.
Starta redigeringsguiden för enhetsmetadata från %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86 genom att dubbelklicka på DeviceMetadataWizard.exe
På menyn Verktyg väljer du Aktivera testsignering.
Starta om datorn
Skapa lösningen genom att öppna lösningsfilen (.sln). Tryck på F7 eller gå till Build->Build Solution i toppmenyn efter att exemplet har laddats in.
Koppla från och avinstallera skrivaren. Det här steget krävs så att Windows läser de uppdaterade enhetsmetadata nästa gång enheten identifieras.
Redigera och spara enhetsmetadata. Om du vill länka enhetsappen till enheten måste du associera enhetsappen med din enhet. Obs! Om du inte har skapat enhetsmetadata ännu kan du läsa Skapa enhetsmetadata för UWP-enhetsappen.
Om guiden För redigering av enhetsmetadata inte är öppen ännu startar du den från %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86 genom att dubbelklicka på DeviceMetadataWizard.exe.
Klicka på Redigera enhetsmetadata. På så sätt kan du redigera ditt befintliga enhetsmetadatapaket.
I dialogrutan Öppna letar du upp det enhetsmetadatapaket som är associerat med UWP-enhetsappen. (Den har ett devicemetadata-ms filnamnstillägg.)
På sidan Ange UWP-enhetsinformation anger du microsoft Store-appinformationen i rutan UWP-enhetsapp. Klicka på Importera UWP-appmanifestfilen för att automatiskt ange Paketnamn, Publisher-namnoch UWP-app-ID.
Om appen registrerar sig för skrivarmeddelanden fyller du i rutan Meddelandehanterare. I händelse-IDanger du namnet på utskriftshändelsehanteraren. I Händelsetillgånganger du namnet på filen där koden finns.
När du är klar klickar du på Nästa tills du kommer till sidan Slutför.
På sidan Granska enhetens metadatapaket kontrollerar du att alla inställningar är korrekta och markerar kryssrutan Kopiera enhetens metadatapaket till metadatalagret på den lokala datorn. Klicka sedan på Spara.
Återanslut skrivaren så att Windows läser de uppdaterade enhetsmetadata när enheten är ansluten.
Relaterade ämnen
enhetsunderhåll (v4-skrivardrivrutin)
Utveckla v4-utskriftsdrivrutiner