解決済み

【Vb.net】プリンタジョブの取得

  • 困ってます
  • 質問No.7335948
  • 閲覧数6424
  • ありがとう数2
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 91% (356/390)

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

質問者が選んだベストアンサー

  • 回答No.3

ベストアンサー率 70% (1019/1451)

『続き』のことに触れられていなかったので、見落としているのかな?
と思いレスしただけです。
VB.Net ・・さっぱり分かりません。
あの『続き』のなかで、
http://msdn.microsoft.com/ja-jp/library/aa970685.aspx
が紹介されていますが、各Queueを個別にRefreshせんとダメっぽいですね。
タイミングとしては、While の直後か End While の直前ではないですかね?
何分サッパリわかりませんので・・・
感謝経済、優待交換9月20日スタート

その他の回答 (全2件)

  • 回答No.2

ベストアンサー率 70% (1019/1451)

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

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

お礼率 91% (356/390)

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

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

何か解決策はありますでしょうか?
投稿日時 - 2012-03-02 09:41:18
  • 回答No.1

ベストアンサー率 58% (728/1234)

.NETのライブラリで動かないなら、WinAPIですね。
CodeProjectのサンプルが良さそう。

http://q.hatena.ne.jp/1315385978
お礼コメント
rigard1225

お礼率 91% (356/390)

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

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

でも、参考にさせて頂きます。
投稿日時 - 2012-03-02 09:37:22
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ