dポイントプレゼントキャンペーン実施中!

プリンターの印刷ジョブを確認すると、N/Aとなっている印刷ジョブが存在します。
実際には0ページなのですが、必要があって保留状態でスプールに蓄積しています。

これを、VBのPrintSystemJobInfoを使ってキャンセルできないかと考えたのですが
指定のプリンターにある0ページの印刷ジョブをどうやってキャンセルしていいかわかりません。

Public Property JobSize As Integer
'使用

Dim instance As PrintSystemJobInfo
Dim value As Integer

value = instance.JobSize

if value = 0 then
instance.cancel
end if

とやればできそうなのですが、プリンタ内にある全てのジョブで
やるには、どのようにループさせればいいのでしょうか?

A 回答 (1件)

'デフォルトプリンタ(物理)のケーブルを抜いておき、


'デフォルトプリンタに、他のアプリケーションからいくつかプリンタジョブを登録した。
'これらのプリンタジョブは枚数が異なるので、2枚以上のジョブが消えるか試してみたらうまくいったようだ。

'注意事項。
'個人的には「MS謹製の.NET FrameworkをWindowsでしか動作させない」という発想で最初から割り切るのが好きでないので、Monoでも試そうとしたのだが、System.Printing名前空間のライブラリが添付されていないようで断念せざるを得なかった。
'アプリケーション配布時は実行環境が.NET 3.0以降専用ライブラリを使用していることをエンドユーザに報告する。

'JobSizeってバイトのサイズみたいだけど、NumberOfPagesじゃなくていいの?
'PrinterServerクラスのコンストラクタにNothingを渡すと、ローカルにつながっているプリンタが前提となる、とドキュメントにあるのだが、実際にNew PrinterServer(Nothing)と渡すと、PrintServer(PrintSystemDesiredAccess)もあるのでオーバーロードの解決ができなくなるので、わざわざ文字列型変数にうけているが、何とかならんものかなあ?

Option Explicit On
Option Strict On

Imports System.Drawing.Printing
Imports System.Printing

Public Class Application
Public Shared Sub Main()
Dim x As String = Nothing
Dim ps As PrintServer = New PrintServer(x)
Dim pq As PrintQueue = ps.GetPrintQueue(new PrinterSettings().PrinterName)
'IEnumerableなのでFor Eachで使えるが、もちろん、そうしなければならないということもない。
'Indexで指定するなら、Listのコンストラクタに渡すべきなんだろうか。
For Each job As PrintSystemJobInfo in pq.GetPrintJobInfoCollection()
If job.NumberOfPages > 1 Then '条件はお好みでどうぞ。
job.Cancel()
End If
Next
End Sub
End Class

この回答への補足

himajin100000さん

さっそくのご回答有難うございます。

因みに、サーバに印刷ジョブがあり、クライアント側から処理したいのですが
Dim x As String = "\\192.168.0.1"

若しくは

Dim x As String = "PrintSVR"
とやってみたのですが、

PrintQueue オブジェクトのプロパティを作成中に例外が発生しました。
Win32 エラー: プリンター名が無効です。
となりました。この場合、xには何を記述すればいいでしょうか?

ご教授くださいますようお願いいたします。

補足日時:2011/05/02 15:39
    • good
    • 0
この回答へのお礼

有難うございました。
本題を先に告げずすみませんでした。

お礼日時:2011/05/03 11:15

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