Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Important
Enhetsmetadata är inaktuella och tas bort i en framtida version av Windows. Information om hur du ersätter den här funktionen finns i Containermetadata för drivrutinspaket.
I Windows 8.1 kan UWP-enhetsappar utföra skrivarunderhåll, till exempel justera utskriftshuvuden och rengöra munstycken. Den här artikeln använder C#-versionen av utskriftsjobbhanterings- och skrivarunderhållsexemplet för att visa hur dubbelriktad kommunikation (Bidi) kan användas för att utföra sådant enhetsunderhåll. 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. To work with Bidi, the sample uses the printer extension library in the PrinterExtensionLibrary project. 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 .
Note
Kodexemplen som visas i den här artikeln baseras på C#-versionen av utskriftsjobbhanterings- och skrivarunderhållsexemplet . Det här exemplet är också tillgängligt i JavaScript och C++. 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.
Printer maintenance
Windows 8.1 introduces new printer extension interfaces in the v4 printer driver that you can use for implementing device maintenance: IPrinterBidiSetRequestCallback, IPrinterExtensionAsyncOperation , and 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).
Tip
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 den här artikeln).
Prerequisites
Innan du börjar:
Kontrollera att skrivaren är installerad med en v4-utskriftsdrivrutin. Mer information finns i Utveckla v4-utskriftsdrivrutiner.
Konfigurera din utvecklingsdator. See Getting started for info about downloading the tools and creating a developer account.
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.
If you're writing your app with C# or JavaScript, add the PrinterExtensionLibrary project to your UWP device app solution. Du hittar det här projektet i utskriftsjobbhantering och skrivarunderhåll exempel.
Note
Eftersom C++ kan komma åt COM direkt kräver C++-appar inte ett separat bibliotek för att fungera med com-baserade skrivarenhetskontexter.
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. For more info about Bidi, see Bidirectional Communications.
This example is from the OnNavigatedTo method of the DeviceMaintenance.xaml.cs file.
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.
This example is from the EnumeratePrinters_Click method of the DeviceMaintenance.xaml.cs file. 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);
}
}
Tip
For more info about the PrinterEnumeration and PrinterInfo classes, see the PrinterEnumeration.cs file.
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.
This example is from the SendBidiRequest_Click method of the DeviceMaintenance.xaml.cs file.
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);
// 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.
This example shows the PrinterBidiSetRequestCallback class definition in the DeviceMaintenance.xaml.cs file.
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.
This example is from the OnBidiResponseReceived method of the DeviceMaintenance.xaml.cs file.
internal async void OnBidiResponseReceived(object sender, string bidiResponse)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
BidiResponseOutput.Text = bidiResponse;
});
}
Testing
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 redigeringsguiden för enhetsmetadata enligt beskrivningen i artikeln Skapa enhetsmetadata för UWP-enhetsappen.
Note
Om du vill använda redigeringsguiden för enhetsmetadata måste du installera Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate eller fristående SDK för Windows 8.1 innan du slutför stegen i den här artikeln. 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
From the Tools menu, select Enable Test Signing.
Starta om datorn
Skapa lösningen genom att öppna lösningsfilen (.sln). Tryck på F7 eller gå till Build-Build> Solution på den översta menyn när exemplet har lästs 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. Om enhetens metadata inte har skapats ännu kan du läsa Skapa enhetsmetadata för UWP-enhetsappen.
Om redigeringsguiden för enhetsmetadata inte är öppen än startar du den från %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86 genom att dubbelklicka påDeviceMetadataWizard.exe.
Välj Redigera enhetsmetadata. Med det här alternativet kan du redigera ditt befintliga enhetsmetadatapaket.
In the Open dialog box, locate the device metadata package associated with your UWP device app. (It has a devicemetadata-ms file extension.)
På sidan Ange UWP-enhetsinformation anger du microsoft Store-appinformationen i rutan UWP-enhetsapp. Välj Importera UWP-appmanifestfilen för att automatiskt ange paketnamnet, utgivarens namn och UWP-app-ID.
If your app is registering for printer notifications, fill out the Notification handlers box. In Event ID, enter the name of the print event handler. In Event Asset, enter the name of the file where that code resides.
When you're done, select Next until you get to the Finish page.
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. Then select Save.
Återanslut skrivaren så att Windows läser de uppdaterade enhetsmetadata när enheten är ansluten.