1

仕事

ユーザーがドキュメントを印刷すると、ポップが表示されて一時停止し、フォームをクリックして入力すると、フォームが閉じられ、ジョブが再開されます。

50 台のネットワーク プリンター2000 台のクライアント マシン1 台のプリント サーバーが あります。

各クライアントには3 台または 4 台のプリンターがありました

問題

ユーザーがドキュメントをローカルで印刷する場合(例: PDF PRINTER、XPS DOCUMENT WRITER) (または) ネットワーク プリンター(CANON、HP)を使用すると、印刷ジョブはすぐに一時停止します。

私の試み

ドキュメントのいずれかを印刷すると、イベント リスナーが監視し、印刷ジョブを返します。

  • 最初の一時停止方法では、機能することもあれば、ほとんどの場合、適切に機能しないこともあります。なぜなら、その印刷ジョブを検索しているが、そこには既に印刷されていないからです。

  • In Second Pause Methodは機能しないため、イベント リスナーは Managementbaseobject を返しますが、印刷ジョブを一時停止するには ManagementObject が必要です ManageBaseObject を ManageObject に変換する方法

PRINTJOB イベント リスナー コード

    managementEvent = new ManagementEventWatcher();
    managementEvent.Query = new EventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 0.1 WHERE TargetInstance ISA 'Win32_PrintJob'");
    managementEvent.Scope = new ManagementScope(@"\root\cimv2");
    managementEvent.EventArrived += new EventArrivedEventHandler(printJobArrived_EventArrived);
    managementEvent.Start();

主なアクションコード

private void printJobArrived_EventArrived(object sender, EventArrivedEventArgs e)
{
  try
     {
CurrentprintJob = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value;
    }
    catch(Exception ex){

                       }
}

PRINTJOB メソッド 1 を一時停止するには

 public bool PausePrintJob(string jobname)
            {
                bool isActionPerformed = false;
                try
                { 
                    string searchQuery = "SELECT * FROM Win32_PrintJob WHERE Name LIKE '%"+jobname+"%'";

                    ManagementObjectSearcher searchPrintJobs = new ManagementObjectSearcher(searchQuery);
                    ManagementObjectCollection prntJobCollection = searchPrintJobs.Get();
                    foreach (ManagementObject prntJob in prntJobCollection)
                    {
                                prntJob.InvokeMethod("Pause", null);
                                isActionPerformed = true;
                   }
                }
                catch (Exception ex)
                {
                    new LogFile().WriteErrorLog(ex.StackTrace, ex.Message);
                }
                return isActionPerformed;
            }

印刷ジョブ方法 2 を一時停止するには

 public bool PausePrintJob(ManagementObject currentPrintJob, bool makePause)
        {
            bool isActionPerformed = false;
            try
            {
                {
                    if (makePause == true && currentPrintJob != null)
                    {
                        currentPrintJob.InvokeMethod("Pause", null);
                        isActionPerformed = true;
                    }
                    else if (makePause == true && currentPrintJob != null)
                    {
                        currentPrintJob.InvokeMethod("Resume", null);
                        isActionPerformed = false;
                    }

                }
            }
            catch (Exception ex)
            {
                new LogFile().WriteErrorLog(ex.StackTrace, ex.Message);

            }
            return isActionPerformed;
        } 
4

2 に答える 2

3

WMI はこれには遅すぎます。おそらくFindFirstPrinterChangeNotificationFindNextPrinterChangeNotificationを使用する必要があります。

これらの 例は 役に立つかもしれません。

于 2016-09-09T12:13:10.940 に答える