UWP 디바이스 앱에서 프린터 기본 테넌트를 수행하는 방법

Windows 8.1에서 UWP 디바이스 앱은 인쇄 헤드 정렬 및 노즐 클린 같은 프린터 기본 테넌스를 수행할 수 있습니다. 이 항목에서는 인쇄 작업 관리 및 프린터 기본 테넌트 샘플의 C# 버전을 사용하여 양방향 통신(Bidi)을 사용하여 이러한 디바이스 기본 테넌스를 수행하는 방법을 보여 줍니다. 일반적으로 UWP 디바이스 앱에 대한 자세한 내용은 UWP 디바이스 앱 모임을 참조 하세요.

인쇄 작업 관리 및 프린터 기본 테넌트 샘플의 C# 버전은 DeviceAppForPrinters2 프로젝트의 DeviceMaintenance.xaml.cs 파일프린터 기본 테넌트를 보여 줍니다. Bidi를 사용하기 위해 샘플에서는 PrinterExtensionLibrary 프로젝트의 프린터 확장 라이브러리를 사용합니다. 프린터 확장 라이브러리는 v4 인쇄 드라이버의 프린터 확장 인터페이스에 액세스하는 편리한 방법을 제공합니다. 자세한 내용은 프린터 확장 라이브러리 개요참조하세요.

참고 항목

이 항목에 표시된 코드 예제는 인쇄 작업 관리 및 프린터 기본 테넌트 샘플의 C# 버전을 기반으로 합니다. 이 샘플은 JavaScript 및 C++에서도 사용할 수 있습니다. C++는 COM에 직접 액세스할 수 있으므로 샘플의 C++ 버전에는 코드 라이브러리 프로젝트가 포함되지 않습니다. 샘플을 다운로드하여 최신 버전의 코드를 확인합니다.

프린터 기본 테넌트

Windows 8.1에는 디바이스 기본tenance: IPrinterBidiSetRequestCallback, IPrinterExtensionAsyncOperation IPrinterQueue2를 구현하는 데 사용할 수 있는 v4 프린터 드라이버에 새로운 프린터 확장 인터페이스가 도입되었습니다. 이러한 인터페이스를 사용하면 비동기적으로 Bidi 요청을 포트 모니터로 보내 디바이스 및 프로토콜 관련 명령으로 변환한 다음 프린터로 보낼 수 있습니다. 자세한 내용은 디바이스 유지 관리(v4 프린터 드라이버)를 참조하세요.

C# 및 JavaScript 앱은 COM API에서 직접 작동할 수 없습니다. C# 또는 JavaScript UWP 디바이스 앱을 작성하는 경우 프린터 확장 라이브러리를 사용하여 이 항목과 같이 이러한 인터페이스에 액세스합니다.

필수 조건

시작하기 전에 다음을 수행합니다.

  1. v4 인쇄 드라이버를 사용하여 프린터가 설치되어 있는지 확인합니다. 자세한 내용은 v4 인쇄 드라이버 개발을 참조 하세요.

  2. 개발 PC를 설정합니다. 도구 다운로드 및 개발자 계정 만들기에 대한 자세한 내용은 시작 정보를 참조하세요.

  3. 스토어와 앱을 연결합니다. 자세한 내용은 UWP 디바이스 앱 만들기를 참조하세요.

  4. 프린터를 앱과 연결하는 디바이스 메타데이터를 만듭니다. 자세한 내용은 디바이스 메타데이터 만들기를 참조하세요.

  5. 앱의 기본 페이지에 대한 UI를 빌드합니다. 모든 UWP 디바이스 앱은 시작에서 시작할 수 있으며 여기에서 전체 화면으로 표시됩니다. 시작 환경을 사용하여 디바이스의 특정 브랜딩 및 기능과 일치하는 방식으로 제품 또는 서비스를 강조 표시합니다. 사용할 수 있는 UI 컨트롤 유형에는 특별한 제한이 없습니다. 전체 화면 환경의 디자인을 시작하려면 Microsoft Store 디자인 원칙을 참조하세요.

  6. C# 또는 JavaScript를 사용하여 앱을 작성하는 경우 UWP 디바이스 앱 솔루션에 PrinterExtensionLibrary 프로젝트를 추가합니다. 인쇄 작업 관리 및 프린터 기본 테넌트 샘플에서 이 프로젝트를 찾을 수 있습니다.

참고 항목

C++는 COM에 직접 액세스할 수 있으므로 C++ 앱은 COM 기반 프린터 디바이스 컨텍스트를 사용하기 위해 별도의 라이브러리가 필요하지 않습니다.

1단계: Bidi 요청 준비

디바이스 기본 테넌트 인터페이스를 사용하려면 Bidi 요청이 문자열 형식의 XML 데이터입니다. 앱에서 의미가 있는 모든 곳에서 Bidi 요청을 생성할 수 있습니다. 예를 들어 Bidi 요청을 문자열 상수로 저장하거나 사용자 입력에 따라 동적으로 만들 수 있습니다. 인쇄 작업 관리 및 프린터 기본 테넌트 샘플은 메서드에서 OnNavigatedTo 기본 요청을 생성합니다. Bidi에 대한 자세한 내용은 양방향 통신을 참조 하세요.

이 예제는 DeviceMaintenance.xaml.cs 파일의 메서드에서 OnNavigatedTo 가져옵니다.

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단계: 프린터 찾기

앱이 프린터에 명령을 보내려면 먼저 프린터를 찾아야 합니다. 이를 위해 인쇄 작업 관리 및 프린터 기본 테넌트 샘플에는 PrinterEnumeration.cs 파일에 이름이 지정된 PrinterEnumeration 클래스가 포함됩니다. 이 클래스는 디바이스 메타데이터를 통해 앱과 연결된 모든 프린터를 찾고 각 프린터의 PrinterInfo 이름과 디바이스 ID를 포함하는 개체 목록을 반환합니다.

이 예제는 DeviceMaintenance.xaml.cs 파일의 메서드에서 EnumeratePrinters_Click 가져옵니다. 샘플에서 클래스를 PrinterEnumeration 사용하여 연결된 프린터 목록을 가져오는 방법을 보여 줍니다.

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

클래스 및 클래스에 PrinterEnumeration 대한 자세한 내용은 PrinterEnumeration.cs 파일을 참조 PrinterInfo 하세요.

3단계: Bidi 요청 보내기

Bidi 요청을 보내려면 디바이스 기본 테넌스 인터페이스에는 Bidi 문자열과 콜백이 필요합니다. 이 SendBidiRequest_Click 메서드에서 샘플은 먼저 개체를 PrinterInfo 사용하여 명명 context된 프린터 확장 컨텍스트 개체를 만듭니다. 그런 다음 개체가 PrinterBidiSetRequestCallback 만들어지고 콜백의 OnBidiResponseReceived 이벤트를 처리하기 위해 이벤트 처리기가 추가됩니다. 마지막으로 프린터 확장 컨텍스트의 SendBidiSetRequestAsync 메서드는 Bidi 문자열 및 콜백을 보내는 데 사용됩니다.

이 예제는 DeviceMaintenance.xaml.cs 파일의 메서드에서 SendBidiRequest_Click 가져옵니다.

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

4단계: Bidi 응답 받기

Bidi "set" 작업이 완료되면 형식 PrinterBidiSetRequestCallback의 콜백 개체가 호출됩니다. 이 콜백은 HRESULT 응답에서 오류 처리를 처리한 다음 이벤트를 트리거 OnBidiResponseReceived 하여 이벤트 매개 변수를 통해 Bidi 응답을 보냅니다.

이 예제에서는 DeviceMaintenance.xaml.cs 파일의 클래스 정의를 보여줍니다PrinterBidiSetRequestCallback.

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 응답이 메서드로 OnBidiResponseReceived 전송되며, 이 메서드 Dispatcher 는 UI 스레드에 결과를 표시하는 데 사용됩니다.

이 예제는 DeviceMaintenance.xaml.cs 파일의 메서드에서 OnBidiResponseReceived 가져옵니다.

internal async void OnBidiResponseReceived(object sender, string bidiResponse)
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        BidiResponseOutput.Text = bidiResponse;
    });
}

테스팅

UWP 디바이스 앱을 테스트하려면 먼저 디바이스 메타데이터를 사용하여 프린터에 연결해야 합니다.

디바이스 앱 정보를 추가하려면 프린터에 대한 디바이스 메타데이터 패키지의 복사본이 필요합니다. 디바이스 메타데이터가 없는 경우 UWP 디바이스 앱에 대한 디바이스 메타데이터 만들기 항목에 설명된 대로 디바이스 메타데이터 작성 마법사를 사용하여 빌드할 수 있습니다.

참고 항목

디바이스 메타데이터 작성 마법사를 사용하려면 이 항목의 단계를 완료하기 전에 Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate 또는 Windows 8.1용 독립 실행형 SDK를 설치해야 합니다. Windows용 Microsoft Visual Studio Express를 설치하면 마법사를 포함하지 않는 SDK 버전이 설치됩니다.

다음 단계에서는 앱을 빌드하고 디바이스 메타데이터를 설치합니다.

  1. 테스트 서명을 사용하도록 설정합니다.

    1. DeviceMetadataWizard.exe 두 번 클릭하여 %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86에서 디바이스 메타데이터 제작 마법사시작합니다.

    2. 도구 메뉴에서 테스트 서명 사용을 선택합니다.

  2. 컴퓨터를 다시 부팅

  3. 솔루션(.sln) 파일을 열어 솔루션을 빌드합니다. F7 키를 누르거나 샘플이 로드된 후 상단 메뉴에서 빌드> 솔루션으로 이동합니다.

  4. 프린터 연결을 끊고 제거합니다. 이 단계는 다음에 디바이스가 검색될 때 Windows에서 업데이트된 디바이스 메타데이터를 읽도록 하는 데 필요합니다.

  5. 디바이스 메타데이터를 편집하고 저장합니다. 디바이스 앱을 디바이스에 연결하려면 디바이스 앱을 디바이스와 연결해야 합니다. 참고: 아직 디바이스 메타데이터를 만들지 않은 경우 UWP 디바이스 앱에 대한 디바이스 메타데이터 만들기를 참조하세요.

    1. 디바이스 메타데이터 작성 마법사가 아직 열려 있지 않으면 DeviceMetadataWizard.exe 두 번 클릭하여 %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86에서 시작합니다.

    2. 디바이스 메타데이터 편집을 클릭합니다. 이렇게 하면 기존 디바이스 메타데이터 패키지를 편집할 수 있습니다.

    3. 열기 대화 상자에서 UWP 디바이스 앱과 연결된 디바이스 메타데이터 패키지를 찾습니다. (devicemetadata-ms 파일 확장명입니다.)

    4. UWP 디바이스 앱 정보 지정 페이지의 UWP 디바이스 앱 상자에 Microsoft Store 앱 정보를 입력합니다. UWP 앱 매니페스트 파일 가져오기를 클릭하여 패키지 이름, 게시자 이름UWP 앱 ID를 자동으로 입력합니다.

    5. 앱이 프린터 알림을 등록하는 경우 알림 처리기 상자를 입력 합니다 . 이벤트 ID에서 인쇄 이벤트 처리기의 이름을 입력합니다. 이벤트 자산에서 해당 코드가 있는 파일의 이름을 입력합니다.

    6. 완료되면 마침 페이지에 도착할 때까지 다음클릭합니다.

    7. 디바이스 메타데이터 패키지 검토 페이지에서 모든 설정이 올바른지 확인하고 로컬 컴퓨터 검사 상자의 메타데이터 저장소에 디바이스 메타데이터 패키지 복사를 선택합니다. 그런 다음 Save를 클릭합니다.

  6. 디바이스가 연결될 때 Windows에서 업데이트된 디바이스 메타데이터를 읽도록 프린터를 다시 연결합니다.

디바이스 유지 관리(v4 프린터 드라이버)

v4 인쇄 드라이버 개발

양방향 통신

UWP 앱 시작

UWP 디바이스 앱 만들기(단계별 가이드)

UWP 디바이스 앱에 대한 디바이스 메타데이터 만들기(단계별 가이드)