【C#】【VB.NET】プリンターの印刷が終了するまで待つ

プリンターの印刷が終了するまで待つ方法を調べたのでメモ。
調べるきっかけがVisualBasic案件だったのでVB.NET版も。
下記コードは最小限なので必要に応じてエラー処理なりタイムアウト処理なり設定してください。

参考サイト
stackoverflow.com


C#

using System.Printing;

/// <summary>
/// プリンターのキューが終了するまで待機します。
/// </summary>
/// <param name="printerName">プリンター名</param>
private void WaitUntilEndOfPrinting(string printerName)
{
    LocalPrintServer localPrintServer = new LocalPrintServer();
    PrintQueue printQueue = localPrintServer.GetPrintQueue(printerName);
    PrintJobInfoCollection printJobInfos = printQueue.GetPrintJobInfoCollection();

    foreach (PrintSystemJobInfo printJobInfo in printJobInfos)
    {
        bool isEnded = false;
        while (!isEnded)
        {
            System.Threading.Thread.Sleep(1000);
            
            printQueue.Refresh();
            printJobInfo.Refresh();
            isEnded = printJobInfo.IsCompleted || printJobInfo.IsDeleted || printJobInfo.IsPrinted;
        }
    }
}



VB.NET

Imports System.Printing

''' <summary>
''' プリンターのキューが終了するまで待機します。
''' </summary>
''' <param name="printerName">プリンター名</param>
Private Sub WaitUntilEndOfPrinting(printerName As String)
    Dim localPrintServer As New LocalPrintServer
    Dim printQueue As PrintQueue = localPrintServer.GetPrintQueue(printerName)
    Dim printJobInfos As PrintJobInfoCollection = printQueue.GetPrintJobInfoCollection()

    For Each printJobInfo As PrintSystemJobInfo In printJobInfos
        Dim isEnded As Boolean = False
        While (Not isEnded)
            System.Threading.Thread.Sleep(1000)

            printQueue.Refresh()
            printJobInfo.Refresh()
            isEnded = printJobInfo.IsCompleted Or printJobInfo.IsDeleted Or printJobInfo.IsPrinted
        End While
    Next
End Sub