いつでもWin32_PrintJob
クラスを使用して印刷ジョブを取得でき、その印刷ジョブから合計ページを取得できます。印刷ジョブのステータスがスプーリングから印刷に移行した後、合計ページ数が利用可能になることに注意してください (これは、私が自分のコードで経験したことです)。
私の場合、WMI を使用して印刷ジョブを監視しEventArrived
、ウォッチャーのイベント ハンドラーに、印刷ジョブの合計ページ数を取得するコード行を追加します。
これを試して:
public void PrintJobChange(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject objProps = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value;
...
string jobStatus = (string)objProps["JobStatus"];
uint totalPages = ((uint)objProps["TotalPages"]);
Console.WriteLine("Status: " + jobStatus + ", Total Pages: " + totalPages);
}
次に、ハンドラーPrintJobChange
にサブスクライブします。EventArrived
public void MonitorPrintJobs()
{
string queryClassName = "__InstanceOperationEvent";
string queryCond = "TargetInstance ISA 'Win32_PrintJob'";
TimeSpan queryTimeSpan = new TimeSpan(1);
try
{
WqlEventQuery eventQuery = new WqlEventQuery(queryClassName, queryTimeSpan, queryCond);
ManagementEventWatcher watcher = new ManagementEventWatcher(eventQuery);
if (PrintJobChange != null)
{
watcher.EventArrived += PrintJobChange;
}
watcher.Start();
}
catch (Exception ex)
{
string msg = string.Format("Error monitoring print jobs. Exception {0} Trace {1}.",
ex.Message, ex.StackTrace);
MessageBox.Show(msg, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
ダミープリンターに1ページだけ印刷するコンソール出力:
ステータス: スプール中、総ページ数: 0
状態: 印刷中、総ページ数: 1