【Vb.net】プリンタジョブの取得
http://jehupc.exblog.jp/8603528/
上記のページを参考にさせて頂きvb.netにて、印刷処理を実行し、印刷ジョブを監視するプログラムを作成しました。
印刷処理を実行した時、印刷は実行されるのですが、どうも印刷の処理自体が早く、プリンタジョブを取得する前にジョブが終了してしまっているようです。
ジョブを監視しようにも、ジョブが既に消えてしまっているので、監視しているループから抜けだせません。
(ジョブが溜まっているときは上手くジョブを取得出来るのでプログラムの処理自体は問題ないと思います。)
どうにか、消えてしまう前にジョブを取得できないでしょうか?
下記が該当のプログラムです。
処理自体はバックグラウンド処理でファイルの個数分ループしています。
--------------------------------------------------------------------------------------
'印刷処理
ShellExecute(IntPtr.Zero, "print", 【ファイルパス】, "", "", 0)
'プリントサーバの情報取得
Dim prtSv As New LocalPrintServer()
'印刷キュー取得
Dim que As PrintQueue = prtSv.DefaultPrintQueue
'処理フラグ T:正常 F:異常
Dim blnRtn As Boolean = True
'ジョブ番号
Dim intJobNum As Integer
'ループ内での時間カウント
Dim intCnt As Integer = 0
'下記のループで待つ時間をミリ秒単位で指定
Dim intWatiMiliTime As Integer = 10
'印刷がキューに入るまで待つ。
While True
'指定ミリ秒待つ
Threading.Thread.Sleep(intWatiMiliTime)
intCnt += intWatiMiliTime
'1分以上たっていたら、印刷に問題があったことにして処理異常フラグを立てる
If intCnt > 60000 Then
blnRtn = False
Exit While
End If
'キューが1つ以上
If que.NumberOfJobs > 0 Then
Dim jobList As New List(Of PrintSystemJobInfo)()
'印刷ジョブコレクション取得
For Each ps As PrintSystemJobInfo In que.GetPrintJobInfoCollection
jobList.Add(ps)
Next
'最新ジョブ名に印刷ファイル名が含まれるとき、このプログラムから印刷キューに入れたと判断する。
If jobList(jobList.Count - 1).Name.EndsWith(【ファイルパス】, True, Nothing) Then
intJobNum = jobList(jobList.Count - 1).JobIdentifier
Exit While
End If
End If
End While
intCnt = 0
'指定されたジョブが印刷完了するまで待つ
While blnRtn
'指定ミリ秒待つ
Threading.Thread.Sleep(intWatiMiliTime)
intCnt += intWatiMiliTime
Dim jobNow As PrintSystemJobInfo
Try
jobNow = que.GetJob(intJobNum)
Catch ex As Exception
'(すでに印刷が完了してジョブが破棄されたとき対策)
'異常フラグ立てループ終了
blnRtn = False
End Try
If jobNow.JobStatus = PrintJobStatus.Completed _
OrElse jobNow.JobStatus = PrintJobStatus.Deleted _
OrElse jobNow.JobStatus = PrintJobStatus.Deleting _
OrElse jobNow.JobStatus = PrintJobStatus.Printed _
OrElse jobNow.JobStatus = PrintJobStatus.Printing _
OrElse jobNow.JobStatus = PrintJobStatus.Retained Then
'ループ終了
Exit While
End If
'ジョブがなんらかのエラか、タイムアウト(1分)したなら処理異常終了
If jobNow.JobStatus = PrintJobStatus.Error _
OrElse jobNow.JobStatus = PrintJobStatus.Offline _
OrElse jobNow.JobStatus = PrintJobStatus.PaperOut _
OrElse jobNow.JobStatus = PrintJobStatus.UserIntervention _
OrElse intCnt > 60000 Then
'異常フラグ立てループ終了
blnRtn = False
End If
End While
お礼
ありがとうございます。 明日職場で試してみます。