0

プリンター キュー (.NET) のモニター ジョブからこのコードをダウンロードしまし たが、印刷ジョブの合計ページ数を知りたいと考えています。コメントを見て、次のコードを追加しました。

if ( data[ i ].Field == (ushort)PRINTERJOBNOTIFICATIONTYPES.JOB_NOTIFY_FIELD_TOTAL_PAGES &&
    data[ i ].Type == (ushort)PRINTERNOTIFICATIONTYPES.PRINTER_NOTIFY_TYPE )
{
    uint pagesCount = data[ i ].NotifyData.adwData[ 0 ];
}

しかし、私はいつも間違ったページを取得します。そして、「PrinterQueueWatch」を使用してみましたが、合計ページは常に0です。

4

1 に答える 1

0

いつでも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
于 2017-01-18T08:35:51.490 に答える