-1

私はほぼ2日間これを続けてきましたが、何も達成していません!!
Windows OS で印刷されたページ数をカウントするプログラムを作成するように割り当てられました。
私の知る限り、印刷イベントを傍受して内部的にカウントする必要があります。どちらを使用する必要がFindFirstPrinterChangeNotificationありますかFindNextPrinterChangeNotification

PrinterNotifyWaitCallback次の署名でコールバック関数を割り当てましたが、印刷イベントが発生すると複数回発生します。

 public void PrinterNotifyWaitCallback(Object state, bool timedOut) { ... }

問題:

印刷イベントがPrinterNotifyWaitCallback 複数回発生する理由についてはいくつかの手がかりがありますが、それらの複数のコールバックの中で実際の印刷コールバックイベントを区別できません。これは明らかに関係Object stateがありますが、カウントしている目的を達成する方法に関するドキュメントはありません印刷されたページ。

質問:

  1. システム全体PrinterNotifyWaitCallbackの合計印刷ページ数をカウントするための実際の印刷コールバックを区別する方法は?
  2. タスクを達成するための他のより良い方法はありますか?
4

1 に答える 1

0

私は大まかに解決策を見つけましたWMI。価値があるのは、印刷されたページを数えるために次のことを思いついたことです。

lock (this._printStatusLast)
{
    // make a query to OS
    // TODO: make the printers exclude from counting in below query (defined by admin)
    ManagementObjectCollection pmoc = new ManagementObjectSearcher("SELECT Name, NotReadyErrors, OutofPaperErrors, TotalJobsPrinted, TotalPagesPrinted FROM Win32_PerfRawData_Spooler_PrintQueue").Get();
    Dictionary<String, PrintDetail> phs = new Dictionary<string, PrintDetail>();
    foreach (ManagementObject mo in pmoc)
    {
        // do not count everything twice!! (this is needed to for future developments on excluding printers from getting count)
        if (mo["name"].ToString().ToLower() == "_total") continue;
        PrintDetail pd = new PrintDetail();
        foreach (PropertyData prop in mo.Properties)
        {
            if (prop.Name.ToLower() == "name") continue;
            pd[prop.Name] = (UInt32)prop.Value;
        }
        phs.Add(mo["name"].ToString(), pd);
    }
    UInt32 count = 0;
    // foreach category
    foreach (var _key in phs.Keys.ToArray<String>())
    {
        // do not count if there where any errors
        if (phs[_key].HasError) continue;
        count += phs[_key].TotalPagesPrinted;
    }
    this.txtPrint.Text = count.ToString();
    this._printStatusLast = new Dictionary<string, PrintDetail>(phs);
}
于 2015-08-15T23:32:02.030 に答える