2016-04-17 15 views
0

私は、プリンタキューを監視し、イベント情報を使用して、ページ数、方向、色の有無、要求されたコピーの数など、ジョブに関するいくつかの詳細を収集しています。プリンタジョブの特定のプリンタプロパティを特定するにはどうすればよいですか?

私はMerrion Computingのコードを使用してイベントをキャッチします(これは現在オープンソースです)。 interopを処理します。

Colorの場合、JOB_INFO_2.pDeviceMode.dmColorに格納されているはずです。しかし、私はどのように仕事を提出(色やモノクロを含むいくつかのアプリからプリンタのプロパティの印刷を使用して白と黒)、それは常に色を示しています。私はそのコードを直接デバッグし、interopは正しいと思われますので、イベントのJobIdを使用して、コードを使って.NET経由でプリントシステムに問い合わせます(下記参照)。コピーとカラーの設定がまったく同じです。

int iJobId = e.PrintJob.JobId; 

LocalPrintServer printServer = new LocalPrintServer(); 
PrintQueueCollection queueCollection = printServer.GetPrintQueues(); 
foreach (PrintQueue queue in queueCollection) 
{ 
queue.Refresh(); 
if(queue.FullName.Equals(e.PrintJob.PrinterName,StringComparison.OrdinalIgnoreCase)) 
{ 
    int? iPageCount; 

    PrintJobInfoCollection jobs = queue.GetPrintJobInfoCollection(); 
    foreach(PrintSystemJobInfo job in jobs) 
    { 
    job.Refresh(); 
    if(job.JobIdentifier==iJobId) 
    { 
     iPageCount = job.NumberOfPages; 
    } 
    } 

    //-- Found the Printer... 
    int? iCopyCount=queue.CurrentJobSettings.CurrentPrintTicket.CopyCount; 
    PageOrientation? eOrientation = queue.CurrentJobSettings.CurrentPrintTicket.PageOrientation; 
    OutputColor? eColor = queue.CurrentJobSettings.CurrentPrintTicket.OutputColor; 

    Debug.WriteLine("queue=" + queue.FullName + ", Copies=" + iCopyCount.Value + ",Color=" + eColor.ToString() + ", pagecount=" + "unk" /*iPageCount.Value*/ + ", Orientation=", eOrientation.ToString()); 
    Debug.WriteLine("---"); 
} 
} 

特定のプリンタジョブに対して、コピー数とページ数(.NETを使用することをお勧めします)を取得する信頼できる方法を見た人はいますか? I

私は、このタイプの問題を説明しているこの記事を見つけましたが、解決策はありませんでした。

Determine current print job color using C#

また、上記の記事からWMIコードも色を返すことに留意すべきです。

印刷用のイベントログ(http://www.papercut.com/kb/Main/LogPrintJobsInEventViewer)を有効にしました。印刷イベントの詳細を見る。色の設定は、グレースケールを示す「2」と予想されます。

Windowsサブシステムが要求された設定を受信して​​いることは明らかです。しかし、WMI、System.Printingのネームスペース、またはMerrionの印刷モニタ​​リングライブラリからのinteropを使用して値を取得するのに失敗しました。ここで、値はジョブが正しいページ数とコピー数でカラーであることを示します。

+0

印刷枚数および/または印刷された実際のページ数は、印刷ジョブが完了した時点では検出されません。 –

+0

これは基本的にこれが不可能であると言う別の投稿を発見しました。どのようにすることができますか? http://stackoverflow.com/questions/7256737/get-the-total-amount-of-pages-from-win32-printjob/7320518#7320518 –

答えて

0

この印刷用に生成されたスプールファイルを取得して、dmColor設定自体を設定していることを確認できますか?

イベントログから取得する設定は2ですが、DMCOLOR_COLORではなくDMCOLOR_MONOCHROMEに対応しているため、ログの色設定も色と思われます。

プリンタドライバは、作成時にジョブをカラーで送信した後、モノクロに変更するスプールに「デバイス設定の設定」メッセージを送信すると、少し卑劣なことがありますか?その場合、スプールファイルにSPT_DEVMODEレコードが存在するはずです。

チェックスプールファイルリーダーのためのこの記事:http://www.codeproject.com/Articles/10586/EMF-Printer-Spool-File-Viewer

0

あなたはフラグIsSpoolingがfalseになるまで、あなたのジョギングをリフレッシュする必要があります。

for (int i = 0; i < jobs.Count(); i++) 
{ 
    try 
    { 
     int timeOut = 20000; 
     var jobInfo = jobs.ElementAt(i);        
     while (jobInfo.IsSpooling && timeOut > 0) 
     { 
      Thread.Sleep(100); 
      timeOut-=100; 
      jobInfo.Refresh(); 
     }                                  var pages = Math.Max(jobInfo.NumberOfPages,jobInfo.NumberOfPagesPrinted); 
    } 
} 
関連する問題