Aracılığıyla paylaş


UWP cihaz uygulamasında yazıcı bakımı yapma

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 UWP cihaz uygulamaları yazıcı kafalarını hizalama ve nozulları temizleme gibi yazıcı bakımı gerçekleştirebilir. Bu makalede, bu tür cihaz bakımı gerçekleştirmek için çift yönlü iletişimin (Bidi) nasıl kullanılabileceğini göstermek için Yazdırma işi yönetimi ve yazıcı bakım örneğinin C# sürümü kullanılmaktadır. Genel olarak UWP cihaz uygulamaları hakkında daha fazla bilgi edinmek için bkz. UWP cihaz uygulamalarıyla tanışın.

Yazdırma işi yönetimi ve yazıcı bakımı örneğin C# sürümü, DeviceAppForPrinters2 projesindeki DeviceMaintenance.xaml.cs dosyasıyla yazıcı bakımını gösterir. To work with Bidi, the sample uses the printer extension library 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 makalede gösterilen kod örnekleri , Yazdırma işi yönetimi ve yazıcı bakım örneğinin 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ü kod kitaplığı projelerini içermez. Kodun en son sürümlerini görmek için örnekleri indirin.

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. Bu arabirimler, cihaza ve protokole özgü komutlara çevrilebilmeleri ve ardından yazıcıya gönderilebilmeleri için bağlantı noktası izleyicisine zaman uyumsuz olarak Bidi istekleri göndermeyi mümkün hale getirir. Daha fazla bilgi için bkz. Cihaz Bakımı (v4 Yazıcı Sürücüsü).

Tip

C# ve JavaScript uygulamaları COM API'leriyle doğrudan çalışamaz. C# veya JavaScript UWP cihaz uygulaması yazıyorsanız, bu arabirimlere erişmek için yazıcı uzantısı kitaplığını kullanın (bu makalede gösterildiği gibi).

Prerequisites

Başlamadan önce:

  1. 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.

  2. Geliştirme bilgisayarınızı ayarlayın. See Getting started for info about downloading the tools and creating a developer account.

  3. Uygulamanızı mağazayla ilişkilendirin. Daha fazla bilgi için bkz. UWP cihaz uygulaması oluşturun.

  4. Yazıcınızı uygulamanızla ilişkilendiren cihaz meta verileri oluşturun. Daha fazla bilgi için bkz. Cihaz meta verileri oluşturma.

  5. Uygulamanızın ana sayfası için kullanıcı arabirimini oluşturun. Tüm UWP cihaz uygulamaları, tam ekran görüntülendiği Başlangıç ekranından başlatılabilir. Ürün veya hizmetlerinizi, cihazlarınızın belirli markalarına ve özelliklerine uygun şekilde vurgulamak için Başlangıç deneyimini kullanın. Kullanabileceği kullanıcı arabirimi denetimlerinin türüyle ilgili özel bir kısıtlama yoktur. Tam ekran deneyiminin tasarımını kullanmaya başlamak için Microsoft Store tasarım ilkelerine bakın.

  6. If you're writing your app with C# or JavaScript, add the PrinterExtensionLibrary project to your UWP device app solution. Bu projeyi yazdırma işi yönetimi ve yazıcı bakımı ö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: Bidi isteğini hazırlama

Cihaz bakım arabirimleri, Bidi isteklerinizin dize biçiminde XML verileri olmasını gerektirir. Bidi isteklerinizi uygulamanızda anlamlı olduğu her yerde oluşturabilirsiniz. Örneğin, Bidi isteklerini dize sabitleri olarak kaydedebilir veya kullanıcı girişine göre dinamik olarak oluşturabilirsiniz. yazdırma işi yönetimi ve yazıcı bakımı örneği, OnNavigatedTo yönteminde varsayılan bir istek oluşturma görevini yerine getirir. 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>";

2. Adım: Yazıcıyı bulma

Uygulamanızın yazıcıya komut gönderebilmesi için önce yazıcıyı bulması gerekir. Bunu yapmak için Yazdırma işi yönetimi ve yazıcı bakımı örneği PrinterEnumeration adlı bir sınıf içerir (PrinterEnumeration.cs dosyasında). Bu sınıf, cihaz meta verileri aracılığıyla uygulamanızla ilişkilendirilmiş tüm yazıcıları bulur ve her yazıcının adlarını ve cihaz kimliklerini içeren PrinterInfo nesnelerinin listesini döndürür.

This example is from the EnumeratePrinters_Click method of the DeviceMaintenance.xaml.cs file. Örnek, ilişkili yazıcıların listesini almak için PrinterEnumeration sınıfını nasıl kullandığını gösterir.

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.

3. Adım: Bidi isteği gönderme

Bidi isteğini göndermek için cihaz bakım arabirimleri bir Bidi dizesi ve bir geri çağırma gerektirir. SendBidiRequest_Click yönteminde, örnek ilk olarak PrinterInfoadlı bir yazıcı uzantısı bağlam nesnesi oluşturmak için bir context nesnesi kullanır. Ardından bir PrinterBidiSetRequestCallback nesnesi oluşturulur ve geri çağırmanın OnBidiResponseReceived olayını işlemek için bir olay işleyicisi eklenir. Son olarak, Bidi dizesini ve geri çağırmayı göndermek için yazıcı uzantısı bağlamın SendBidiSetRequestAsync yöntemi kullanılır.

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

4. Adım: Bidi yanıtı alma

Bidi "set" işlemi tamamlandığında, PrinterBidiSetRequestCallbacktüründe geri çağırma nesnesi çağrılır. Bu geri çağırma HRESULT yanıtından hata işlemeyi halleder ve ardından OnBidiResponseReceived olayını tetikler ve olay parametreleri aracılığıyla Bidi yanıtını gönderir.

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

Daha sonra Bidi yanıtı OnBidiResponseReceived yöntemine gönderilir ve burada ui iş parçacığında sonuçları görüntülemek için Dispatcher kullanılır.

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

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, UWP cihaz uygulamanız için cihaz meta verileri oluşturma makalesinde açıklandığı gibi Cihaz Meta Verileri Yazma Sihirbazı'nı kullanarak oluşturabilirsiniz.

Note

Bu makaledeki adımları tamamlamadan önce , Cihaz Meta Veri Yazma Sihirbazı'nı kullanmak için Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate veya Windows 8.1 için tek 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.

  1. Test imzalamayı etkinleştirin.

    1. %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86'dan Cihaz Meta Veri Yazma SihirbazıDeviceMetadataWizard.exe

    2. From the Tools menu, select Enable Test Signing.

  2. Bilgisayarı yeniden başlatın

  3. Çö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ü'ne> gidin.

  4. 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.

  5. 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. Cihaz meta verileriniz henüz oluşturulmadıysa bkz. UWP cihaz uygulamanız için cihaz meta verileri oluşturma.

    1. 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.

    2. Cihaz Meta Verilerini Düzenle'yi seçin. Bu seçenek, mevcut cihaz meta veri paketinizi düzenlemenizi sağlar.

    3. In the Open dialog box, locate the device metadata package associated with your UWP device app. (It has a devicemetadata-ms file extension.)

    4. UWP cihaz uygulaması bilgilerini belirtin sayfasında, UWP cihaz uygulaması kutusuna Microsoft Store uygulama bilgilerini girin. Paket adını, Yayımcı adını ve UWP uygulama kimliğini otomatik olarak girmek için UWP uygulamabildirim dosyasını içeri aktar'ı seçin.

    5. 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.

    6. When you're done, select Next until you get to the Finish page.

    7. 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 select Save.

  6. Windows'un cihaz bağlandığında güncelleştirilmiş cihaz meta verilerini okuması için yazıcınızı yeniden bağlayın.