プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (3件)

『続き』のことに触れられていなかったので、見落としているのかな?


と思いレスしただけです。
VB.Net ・・さっぱり分かりません。
あの『続き』のなかで、
http://msdn.microsoft.com/ja-jp/library/aa970685 …
が紹介されていますが、各Queueを個別にRefreshせんとダメっぽいですね。
タイミングとしては、While の直後か End While の直前ではないですかね?
何分サッパリわかりませんので・・・
    • good
    • 0

質問者さんが参考にされたサイトには、下の方に続きがありますけど・・・。



追記:この方法ではジョブやキューの状態取得に問題があることが判明しました。
詳しくは(VB.Net)[補足2].NetからのPDFファイル印刷方法を参照。
http://jehupc.exblog.jp/8650821/
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

該当のページは既に見させていただいてました。
記事中のRefresh()を試してみたのですが、いまいちどこに入れていいか分からず、入れて実行してもRefresh()でエラーが発生してしまいました。

何か解決策はありますでしょうか?

お礼日時:2012/03/02 09:41

.NETのライブラリで動かないなら、WinAPIですね。


CodeProjectのサンプルが良さそう。

http://q.hatena.ne.jp/1315385978
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

なんか難しそうで、理解に時間がかかりそうです。

でも、参考にさせて頂きます。

お礼日時:2012/03/02 09:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A