Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Important
Metadane urządzenia są przestarzałe i zostaną usunięte w przyszłej wersji systemu Windows. Aby uzyskać informacje o zastąpieniu tej funkcji, zobacz Driver Package Container Metadata (Metadane kontenera pakietów sterowników).
W systemie Windows 8.1 użytkownicy mogą sprawdzić stan drukarki z nowoczesnego interfejsu użytkownika aplikacji urządzenia platformy UWP. W tym temacie używany jest przykładowy projekt ustawienia wydruku i powiadomienia o wydruku w języku C#, aby zademonstrować, jak zapytać o stan drukarki i go wyświetlić. Aby dowiedzieć się więcej o aplikacjach urządzeń platformy uniwersalnej systemu Windows, zobacz Poznaj aplikacje urządzeń UWP.
Przykładowa wersja języka C# ustawień drukowania i powiadomień drukowania używa strony InkLevel.xaml , aby zademonstrować, jak uzyskać stan drukarki (w tym przypadku poziom pisma odręcznego) i wyświetlić go. Klasa pomocnika wydruku służy do tworzenia kontekstu urządzenia (IPrinterExtensionContext) i wykonywania zapytań dotyczących urządzenia. The PrinterHelperClass.cs file is in the DeviceAppForPrintersLibrary project and uses APIs defined in the PrinterExtensionLibrary project. Biblioteka rozszerzeń drukarki zapewnia wygodny sposób uzyskiwania dostępu do interfejsów rozszerzeń drukarki sterownika wydruku w wersji 4. Aby uzyskać więcej informacji, zobacz Omówienie biblioteki rozszerzeń drukarki.
Note
Przykłady kodu pokazane w tym temacie są oparte na wersji języka C# ustawień drukowania i przykładowych powiadomień drukowania . Ten przykład jest również dostępny w językach JavaScript i C++. Należy pamiętać, że ponieważ język C++ może uzyskać bezpośredni dostęp do interfejsu COM, wersja języka C++ przykładu nie zawiera projektów biblioteki kodu. Pobierz przykłady, aby wyświetlić najnowsze wersje kodu.
Prerequisites
Przed rozpoczęciem pracy:
Upewnij się, że drukarka jest zainstalowana przy użyciu sterownika wydruku w wersji 4. Aby uzyskać więcej informacji, zobacz Tworzenie sterowników wydruku w wersji 4.
Skonfiguruj komputer deweloperów. See Getting started for info about downloading the tools and creating a developer account.
Skojarz aplikację ze sklepem. Zobacz Krok 1. Tworzenie aplikacji urządzenia platformy UNIWERSALNEJ systemu Windows , aby uzyskać informacje o tym.
Utwórz metadane urządzenia dla drukarki, która skojarzy ją z aplikacją. Zobacz Krok 2. Tworzenie metadanych urządzenia , aby uzyskać więcej informacji na ten temat.
Każdy z tych projektów można znaleźć w przykładzie Ustawienia drukowania i powiadomienia drukowania . You can find each of these projects in the Print settings and print notifications sample.
Note
Ponieważ język C++ może uzyskiwać bezpośredni dostęp do modelu COM, aplikacje języka C++ nie wymagają oddzielnej biblioteki do pracy z kontekstem urządzenia drukarki opartej na modelu COM.
Krok 1. Znajdowanie drukarki
Aby można było utworzyć kontekst urządzenia, aplikacja musi określić identyfikator urządzenia drukarki. W tym celu przykład używa EnumerateAssociatedPrinters metody do wyszukiwania wszystkich drukarek dołączonych do komputera. Następnie sprawdza kontener dla każdej drukarki i wyszukuje skojarzenie, porównując właściwość PackageFamilyName każdego kontenera.
Note
The System.Devices.AppPackageFamilyName for devices that are associated with your app can be found under the Packaging tab on the Manifest Designer in Microsoft Visual Studio.
This example shows the EnumerateAssociatedPrinters method from the InkLevel.xaml.cs file:
async void EnumerateAssociatedPrinters(object sender, RoutedEventArgs e)
{
// Reset output text and associated printer array.
AssociatedPrinters.Items.Clear();
BidiOutput.Text = "";
// GUID string for printers.
string printerInterfaceClass = "{0ecef634-6ef0-472a-8085-5ad023ecbccd}";
string selector = "System.Devices.InterfaceClassGuid:=\"" + printerInterfaceClass + "\"";
// By default, FindAllAsync does not return the containerId for the device it queries.
// We have to add it as an additional property to retrieve.
string containerIdField = "System.Devices.ContainerId";
string[] propertiesToRetrieve = new string[] { containerIdField };
// Asynchronously find all printer devices.
DeviceInformationCollection deviceInfoCollection = await DeviceInformation.FindAllAsync(selector, propertiesToRetrieve);
// For each printer device returned, check if it is associated with the current app.
for (int i = 0; i < deviceInfoCollection.Count; i++)
{
DeviceInformation deviceInfo = deviceInfoCollection[i];
FindAssociation(deviceInfo, deviceInfo.Properties[containerIdField].ToString());
}
}
Metoda FindAssociation, wywoływana przez program EnumerateAssociatedPrinters, sprawdza, czy drukarka jest skojarzona z bieżącą aplikacją. Innymi słowy, ta metoda sprawdza, czy aplikacja jest aplikacją urządzenia platformy UWP. To skojarzenie istnieje, gdy aplikacja i drukarka są zdefiniowane w metadanych urządzenia na komputerze lokalnym.
This example shows the FindAssociation method from the InkLevel.xaml.cs file:
async void FindAssociation(DeviceInformation deviceInfo, string containerId)
{
// Specifically telling CreateFromIdAsync to retrieve the AppPackageFamilyName.
string packageFamilyName = "System.Devices.AppPackageFamilyName";
string[] containerPropertiesToGet = new string[] { packageFamilyName };
// CreateFromIdAsync needs braces on the containerId string.
string containerIdwithBraces = "{" + containerId + "}";
// Asynchronously getting the container information of the printer.
PnpObject containerInfo = await PnpObject.CreateFromIdAsync(PnpObjectType.DeviceContainer, containerIdwithBraces, containerPropertiesToGet);
// Printers could be associated with other device apps, only the ones with package family name
// matching this app's is associated with this app. The packageFamilyName for this app will be found in this app's packagemanifest
string appPackageFamilyName = "Microsoft.SDKSamples.DeviceAppForPrinters.CS_8wekyb3d8bbwe";
var prop = containerInfo.Properties;
// If the packageFamilyName of the printer container matches the one for this app, the printer is associated with this app.
string[] packageFamilyNameList = (string[])prop[packageFamilyName];
if (packageFamilyNameList != null)
{
for (int j = 0; j < packageFamilyNameList.Length; j++)
{
if (packageFamilyNameList[j].Equals(appPackageFamilyName))
{
AddToList(deviceInfo);
}
}
}
}
Po znalezieniu FindAssociation skojarzenia metoda używa AddToList metody , aby dodać identyfikator urządzenia do listy skojarzonych identyfikatorów urządzeń. Te identyfikatory są przechowywane w polu ComboBox o nazwie AssociatedPrinters.
This example shows the AddToList method from the InkLevel.xaml.cs file:
void AddToList(DeviceInformation deviceInfo)
{
// Creating a new display item so the user sees the friendly name instead of the interfaceId.
ComboBoxItem item = new ComboBoxItem();
item.Content = deviceInfo.Properties["System.ItemNameDisplay"] as string;
item.DataContext = deviceInfo.Id;
AssociatedPrinters.Items.Add(item);
// If this is the first printer to be added to the combo box, select it.
if (AssociatedPrinters.Items.Count == 1)
{
AssociatedPrinters.SelectedIndex = 0;
}
}
Krok 2. Wyświetlanie stanu
Metoda GetInkStatus używa asynchronicznego wzorca opartego na zdarzeniach w celu żądania informacji z drukarki. Ta metoda używa skojarzonego identyfikatora urządzenia, aby uzyskać kontekst urządzenia, którego można użyć do uzyskania stanu urządzenia. Wywołanie metody printHelper.SendInkLevelQuery() inicjuje zapytanie urządzenia. Gdy zwracana jest odpowiedź, OnInkLevelReceived metoda jest wywoływana i interfejs użytkownika jest aktualizowany.
Note
Ten przykład w języku C# jest zgodny z innym wzorcem niż przykładowy kod JavaScript, ponieważ język C# umożliwia wysyłanie dyspozytora do klasy PrintHelperClass, dzięki czemu może publikować komunikaty zdarzeń z powrotem do wątku interfejsu użytkownika.
This example shows the GetInkStatus and OnInkLevelReceived methods from the InkLevel.xaml.cs file:
void GetInkStatus(object sender, RoutedEventArgs e)
{
if (AssociatedPrinters.Items.Count > 0)
{
// Get the printer that the user has selected to query.
ComboBoxItem selectedItem = AssociatedPrinters.SelectedItem as ComboBoxItem;
// The interfaceId is retrieved from the detail field.
string interfaceId = selectedItem.DataContext as string;
try
{
// Unsubscribe existing ink level event handler, if any.
if (printHelper != null)
{
printHelper.OnInkLevelReceived -= OnInkLevelReceived;
printHelper = null;
}
object context = Windows.Devices.Printers.Extensions.PrintExtensionContext.FromDeviceId(interfaceId);printHelper.SendInkLevelQuery()
// Use the PrinterHelperClass to retrieve the bidi data and display it.
printHelper = new PrintHelperClass(context);
try
{
printHelper.OnInkLevelReceived += OnInkLevelReceived;
printHelper.SendInkLevelQuery();
rootPage.NotifyUser("Ink level query successful", NotifyType.StatusMessage);
}
catch (Exception)
{
rootPage.NotifyUser("Ink level query unsuccessful", NotifyType.ErrorMessage);
}
}
catch (Exception)
{
rootPage.NotifyUser("Error retrieving PrinterExtensionContext from InterfaceId", NotifyType.ErrorMessage);
}
}
}
private void OnInkLevelReceived(object sender, string response)
{
BidiOutput.Text = response;
}
Klasa pomocnika wydruku zajmuje się wysyłaniem zapytania Bidi do urządzenia i odbieraniem odpowiedzi.
This example shows the SendInkLevelQuery method, and others, from the PrintHelperClass.cs file. Należy pamiętać, że w tym miejscu są wyświetlane tylko niektóre metody klasy pomocnika wydruku. Pobierz przykładowe ustawienia drukowania i powiadomienia drukowania, aby zobaczyć pełny kod.
public void SendInkLevelQuery()
{
printerQueue.OnBidiResponseReceived += OnBidiResponseReceived;
// Send the query.
string queryString = "\\Printer.Consumables";
printerQueue.SendBidiQuery(queryString);
}
private void OnBidiResponseReceived(object sender, PrinterQueueEventArgs responseArguments)
{
// Invoke the ink level event with appropriate data.
dispatcher.RunAsync(
Windows.UI.Core.CoreDispatcherPriority.Normal,
() =>
{
OnInkLevelReceived(sender, ParseResponse(responseArguments));
});
}
private string ParseResponse(PrinterQueueEventArgs responseArguments)
{
if (responseArguments.StatusHResult == (int)HRESULT.S_OK)
return responseArguments.Response;
else
return InvalidHResult(responseArguments.StatusHResult);
}
private string InvalidHResult(int result)
{
switch (result)
{
case unchecked((int)HRESULT.E_INVALIDARG):
return "Invalid Arguments";
case unchecked((int)HRESULT.E_OUTOFMEMORY):
return "Out of Memory";
case unchecked((int)HRESULT.ERROR_NOT_FOUND):
return "Not found";
case (int)HRESULT.S_FALSE:
return "False";
case (int)HRESULT.S_PT_NO_CONFLICT:
return "PT No Conflict";
default:
return "Undefined status: 0x" + result.ToString("X");
}
}
Testing
Aby można było przetestować aplikację urządzenia platformy UWP, należy ją połączyć z drukarką przy użyciu metadanych urządzenia.
Aby dodać do niego informacje o aplikacji urządzenia, potrzebna jest kopia pakietu metadanych urządzenia dla drukarki. Jeśli nie masz metadanych urządzenia, możesz je skompilować przy użyciu Kreatora tworzenia metadanych urządzenia zgodnie z opisem w temacie Krok 2: Tworzenie metadanych urządzenia dla aplikacji urządzenia platformy UWP.
Note
Aby użyć Kreatora tworzenia metadanych urządzenia, przed wykonaniem kroków opisanych w tym temacie należy zainstalować program Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate lub autonomiczny zestaw SDK dla systemu Windows 8.1. Zainstalowanie programu Microsoft Visual Studio Express dla systemu Windows powoduje zainstalowanie wersji zestawu SDK, która nie zawiera kreatora.
W poniższych krokach skompiluj aplikację i zainstaluj metadane urządzenia.
Włącz podpisywanie testowe.
Uruchom Kreatora tworzenia metadanych urządzenia z %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, klikając dwukrotnie DeviceMetadataWizard.exe
From the Tools menu, select Enable Test Signing.
Uruchom ponownie komputer
Skompiluj rozwiązanie, otwierając plik rozwiązania (.sln). Naciśnij F7 lub przejdź do Buduj-Kompiluj rozwiązanie> z górnego menu po załadowaniu przykładu.
Odłącz i odinstaluj drukarkę. Ten krok jest wymagany, aby system Windows odczytał zaktualizowane metadane urządzenia przy następnym wykryciu urządzenia.
Edytowanie i zapisywanie metadanych urządzenia. Aby połączyć aplikację urządzenia z urządzeniem, musisz skojarzyć aplikację urządzenia z urządzeniem.
Note
Jeśli metadane urządzenia nie zostały jeszcze utworzone, zobacz Krok 2. Tworzenie metadanych urządzenia dla aplikacji urządzenia platformy UWP.
Jeśli Kreator tworzenia metadanych urządzenia nie jest jeszcze otwarty, uruchom go od %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, klikając dwukrotnie DeviceMetadataWizard.exe.
Kliknij pozycję Edytuj metadane urządzenia. Umożliwi to edytowanie istniejącego pakietu metadanych urządzenia.
In the Open dialog box, locate the device metadata package associated with your UWP device app. (It has a devicemetadata-ms file extension.)
Na stronie Określanie informacji o aplikacji urządzenia UWP wprowadź informacje o aplikacji ze Sklepu Microsoft w polu tekstowym Aplikacja urządzenia platformy UWP. Kliknij pozycję Importuj plik manifestu aplikacji platformy UWP , aby automatycznie wprowadzić nazwę pakietu, nazwę wydawcy i identyfikator aplikacji platformy UWP.
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, click Next until you get to the Finish page.
Na stronie Przeglądanie pakietu metadanych urządzenia upewnij się, że wszystkie ustawienia są poprawne, a następnie zaznacz pole wyboru Kopiuj pakiet metadanych urządzenia do magazynu metadanych na komputerze lokalnym . Then click Save.
Połącz ponownie drukarkę, aby system Windows odczytał zaktualizowane metadane urządzenia po nawiązaniu połączenia z urządzeniem.
Troubleshooting
Problem: Nie można odnaleźć drukarki podczas wyliczania urządzeń skojarzonych z aplikacją
Jeśli drukarka nie zostanie znaleziona podczas wyliczania skojarzonych drukarek:
Possible cause: Test signing is not turned on. Aby uzyskać informacje na temat włączania go, zobacz sekcję Debugowanie w tym temacie.
Possible cause: The app is not querying for the right Package Family Name. Sprawdź nazwę rodziny pakietów w kodzie. Open up package.appxmanifest in Microsoft Visual Studio and make sure that the package family name you are querying for matches the one in the Packaging tab, in the Package Family Name field.
Possible cause: The device metadata is not associated with the Package Family Name. Użyj Kreatora tworzenia metadanych urządzenia , aby otworzyć metadane urządzenia i sprawdzić nazwę rodziny pakietów. Start the wizard from %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, by double-clicking DeviceMetadataWizard.exe.
Problem: Znaleziono drukarkę skojarzona z aplikacją, ale nie może wykonywać zapytań dotyczących informacji o bidi
Jeśli drukarka została znaleziona podczas wyliczania skojarzonych drukarek, ale zapytanie Bidi zwraca błąd...
Possible cause: Wrong package family name. Sprawdź nazwę rodziny pakietów w kodzie. Open up package.appxmanifest in Visual Studio and make sure that the package family name you are querying for matches the one in the Packaging tab, in the Package Family Name field.
Possible cause: Printer was installed using a v3 printer, rather than a v4 printer. Aby sprawdzić, która wersja jest zainstalowana, otwórz program PowerShell i wpisz następujące polecenie:
get-printer | Select Name, {(get-printerdriver -Name $_.DriverName).MajorVersion}
Related topics
- Tworzenie sterowników druku w wersji 4
- Interfejsy rozszerzeń drukarek (sterownik wydruku w wersji 4)
- Bidirectional Communications
- Wprowadzenie do aplikacji platformy UWP
- Tworzenie aplikacji urządzenia platformy UWP (przewodnik krok po kroku)
- Tworzenie metadanych urządzenia dla aplikacji urządzenia platformy UWP (przewodnik krok po kroku)