Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Important
Cihaz meta verileri kullanım dışıdır ve windows'un gelecek bir sürümünde kaldırılacaktır. Bu işlevin değiştirilmesi hakkında bilgi için bkz . Sürücü Paketi Kapsayıcı Meta Verileri.
Windows 8.1'de kullanıcılar, UWP cihaz uygulamasının modern kullanıcı arabiriminden yazıcı durumlarını denetleyebiliyor. Bu konu, C# sürümündeki Yazdırma ayarları ve yazdırma bildirimleri örneğini kullanarak yazıcı durumunu nasıl sorgulayacağınızı ve görüntüleyeceğinizi gösterir. Genel olarak UWP cihaz uygulamaları hakkında daha fazla bilgi edinmek için bkz. UWP cihaz uygulamalarıyla tanışın.
Yazdırma ayarları ve yazdırma bildirimleri örneğin C# sürümü, yazıcı durumunun (bu örnekte mürekkep düzeyi) nasıl alınıp görüntüleneceğini göstermek için InkLevel.xaml sayfasını kullanır. Yazdırma yardımcı sınıfı, bir cihaz bağlamı (IPrinterExtensionContext) oluşturmak ve cihaz sorgularını gerçekleştirmek için kullanılır. The PrinterHelperClass.cs file is in the DeviceAppForPrintersLibrary project and uses APIs defined in the PrinterExtensionLibrary project. Yazıcı uzantısı kitaplığı, v4 yazdırma sürücüsünün yazıcı uzantısı arabirimlerine erişmek için kullanışlı bir yol sağlar. Daha fazla bilgi için Yazıcı uzantısı kitaplığına genel bakış bölümüne bakın.
Note
Bu konuda gösterilen kod örnekleri, Yazdırma ayarları ve yazdırma bildirimleri örneğin C# sürümünü temel alır. Bu örnek JavaScript ve C++ ile de kullanılabilir. C++ COM'a doğrudan erişebildiğinden, örneğin C++ sürümünün kod kitaplığı projelerini içermediğini unutmayın. Kodun en son sürümlerini görmek için örnekleri indirin.
Prerequisites
Başlamadan önce:
Yazıcınızın bir v4 yazdırma sürücüsü kullanılarak yüklendiğinden emin olun. Daha fazla bilgi için bkz. v4 yazdırma sürücüleri geliştirme.
Geliştirme bilgisayarınızı ayarlayın. See Getting started for info about downloading the tools and creating a developer account.
Uygulamanızı mağazayla ilişkilendirin. Bu konuda bilgi için bkz. 1. Adım: UWP cihaz uygulaması oluşturma .
Yazıcınızı uygulamanızla ilişkilendiren cihaz meta verileri oluşturun. Bu konuda daha fazla bilgi için bkz. Adım 2: Cihaz meta verileri oluşturma.
If you're writing your app with C# or JavaScript, add the PrinterExtensionLibrary and DeviceAppForPrintersLibrary projects to your UWP device app solution. Bu projelerin her birini yazdırma ayarları ve yazdırma bildirimleri örneğinde bulabilirsiniz.
Note
C++ COM'a doğrudan erişebildiğinden, C++ uygulamaları COM tabanlı yazıcı cihaz bağlamıyla çalışmak için ayrı bir kitaplık gerektirmez.
1. Adım: Yazıcıyı bulma
Bir cihaz bağlamının oluşturulabilmesi için önce uygulamanın yazıcının cihaz kimliğini belirlemesi gerekir. Bunu yapmak için örnek, bilgisayara bağlı tüm yazıcılarda arama yapmak için EnumerateAssociatedPrinters yöntemini kullanır. Ardından her yazıcı için kapsayıcıyı denetler ve her kapsayıcının PackageFamilyName özelliğini karşılaştırarak bir ilişkilendirme arar.
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());
}
}
FindAssociationtarafından çağrılan EnumerateAssociatedPrinters yöntemi, yazıcının geçerli uygulamayla ilişkili olup olmadığını denetler. Başka bir deyişle, bu yöntem uygulamanın bir UWP cihaz uygulaması olup olmadığını denetler. Bu ilişki, uygulama ve yazıcı yerel bilgisayardaki cihaz meta verilerinde tanımlandığında bulunur.
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);
}
}
}
}
bir ilişkilendirme bulunduğunda, FindAssociation yöntemi cihaz kimliğini ilişkili cihaz kimlikleri listesine eklemek için AddToList yöntemini kullanır. Bu kimlikler AssociatedPrintersadlı bir ComboBox içinde depolanır.
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;
}
}
2. Adım: Durumu görüntüleme
GetInkStatus yöntemi, yazıcıdan bilgi istemek için zaman uyumsuz olay tabanlı bir desen kullanır. Bu yöntem, cihaz durumunu almak için kullanılabilecek bir cihaz bağlamı almak için ilişkili bir cihaz kimliği kullanır.
printHelper.SendInkLevelQuery() yöntemine yapılan çağrı, cihaz sorgusunu başlatır. Yanıt döndürdüğünde OnInkLevelReceived yöntemi çağrılır ve kullanıcı arabirimi güncelleştirilir.
Note
Bu C# örneği JavaScript örneğinden farklı bir desen izler, çünkü C# olay iletilerini ui iş parçacığına geri gönderebilmesi için PrintHelperClass'a bir dağıtıcı göndermenize olanak tanır.
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;
}
Yazdırma yardımcı sınıfı, Bidi sorgusunu cihaza göndermeyi ve yanıtı almayı üstlenir.
This example shows the SendInkLevelQuery method, and others, from the PrintHelperClass.cs file. Burada yalnızca bazı yazdırma yardımcı sınıfı yöntemlerinin gösterildiğini unutmayın.
Yazdırma ayarları ve bildirim örneğini indirerek tam kodu görün.
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
UWP cihaz uygulamanızı test etmeden önce, cihaz meta verileri kullanılarak yazıcınıza bağlanmalıdır.
Cihaz uygulaması bilgilerini buna eklemek için yazıcınızın cihaz meta veri paketinin bir kopyasına ihtiyacınız vardır. Cihaz meta verileriniz yoksa, Cihaz Meta Verileri Yazma Sihirbazı kullanarak, 2. Adım: UWP cihaz uygulamanız için cihaz meta verileri oluşturmakonusunda açıklandığı gibi oluşturabilirsiniz.
Note
Cihaz Meta Veri Yazma Sihirbazı'nı kullanmak için, bu konudaki adımları tamamlamadan önce Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate veya Windows 8.1 içintek başına SDK'yı yüklemeniz gerekir. Windows için Microsoft Visual Studio Express'in yüklenmesi, SDK'nın sihirbazı içermeyen bir sürümünü yükler.
Aşağıdaki adımlar uygulamanızı oluşturur ve cihaz meta verilerini yükler.
Test imzalamayı etkinleştirin.
%ProgramFiles(x86)%\Windows Kits\8.1\bin\x86'dan Cihaz Meta Veri Yazma SihirbazıDeviceMetadataWizard.exe
From the Tools menu, select Enable Test Signing.
Bilgisayarı yeniden başlatın
Çözüm (.sln) dosyasını açarak çözümü oluşturun. F7 tuşuna basın veya örnek yüklendikten sonra üstteki menüden Derleme->Çözümü Derleme seçeneğine gidin.
Yazıcının bağlantısını kesin ve kaldırın. Cihaz bir sonraki algılandığında Windows'un güncelleştirilmiş cihaz meta verilerini okuması için bu adım gereklidir.
Cihaz meta verilerini düzenleyin ve kaydedin. Cihaz uygulamasını cihazınıza bağlamak için cihaz uygulamasını cihazınızla ilişkilendirmeniz gerekir.
Note
Cihaz meta verilerinizi henüz oluşturmadıysanız bkz. 2. Adım: UWP cihaz uygulamanız için cihaz meta verileri oluşturma.
Cihaz Meta Veri Yazma Sihirbazı henüz açık değilse, DeviceMetadataWizard.exeçift tıklayarak %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86'dan başlatın.
Cihaz Meta Verilerini Düzenle tıklayın. Bu, mevcut cihaz meta veri paketinizi düzenlemenize olanak tanır.
In the Open dialog box, locate the device metadata package associated with your UWP device app. (It has a devicemetadata-ms file extension.)
UWP cihaz uygulaması bilgilerini belirtin sayfasında, UWP cihaz uygulaması kutusuna Microsoft Store uygulama bilgilerini girin. UWP uygulama bildirim dosyasını tıklayarak, Paket adını, Yayıncı adınıve UWP uygulama kimliğiniotomatik olarak girin.
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.
Cihaz meta veri paketini gözden geçir sayfasında, tüm ayarların doğru olduğundan emin olun ve Cihaz meta veri paketini yerel bilgisayardaki meta veri deposuna kopyala onay kutusunu seçin. Then click Save.
Windows'un cihaz bağlandığında güncelleştirilmiş cihaz meta verilerini okuması için yazıcınızı yeniden bağlayın.
Troubleshooting
Sorun: Uygulamayla ilişkili cihazlar numaralandırıldığında yazıcı bulunamıyor
İlişkili yazıcılar numaralandırıldığında yazıcınız bulunamazsa:
Possible cause: Test signing is not turned on. Açma hakkında bilgi için bu konudaki Hata Ayıklama bölümüne bakın.
Possible cause: The app is not querying for the right Package Family Name. Kodunuzda Paket Aile Adını kontrol edin. 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. Cihaz meta verilerini açmak ve paket ailesi adını denetlemek için Cihaz Meta Veri Yazma Sihirbazı'nı kullanın. Start the wizard from %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, by double-clicking DeviceMetadataWizard.exe.
Sorun: Uygulamayla ilişkili yazıcı bulundu, ancak Bidi bilgilerini sorgulayamaz
yazıcınız ilişkili yazıcıları numaralandırırken bulunduysa ancak Bidi sorgusu hata döndürüyorsa...
Possible cause: Wrong package family name. Kodunuzda Paket Aile Adını kontrol edin. 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. Hangi sürümün yüklü olduğunu görmek için PowerShell'i açın ve aşağıdaki komutu yazın:
get-printer | Select Name, {(get-printerdriver -Name $_.DriverName).MajorVersion}