2016-09-03 2 views
0

TASKWie die Win32_PrintJob von printer und JobID pausieren

Wenn der Benutzer das Dokument drucken, halten Sie den Popup erscheint dann füllen Sie das Formular eingeben klicken Sie das Formular geschlossen wird und Arbeit wieder aufgenommen wurde.

Wir haben 50 Netzwerkdrucker, 2000 Client-Maschine und ein Druckserver.

Jeder Kunde hatte 3 oder 4 Drucker

PROBLEM

Wenn der Benutzer das Dokument drucken lokal (EX: PDF-Drucker, XPS Document Writer) (oder) unter Verwendung von Netzwerkdrucker (CANON, HP) der Druckauftrag wurde sofort PAUSE.

MY TRIES

Wenn Druck irgendein des Dokuments der Ereignis-Listener beobachten und senden Sie den Druckauftrag.

  • In Erste Methode Pause manchmal funktionieren und mostof Zeit nicht funktioniert properly.Because, seine Suche nach dem Druckauftrag aber es ist nicht dort ist bereits gedruckt.

  • In zweiten Pause Methode Da nicht funktioniert, Ereignis-Listener die Managementbase zurück, aber Wenn Sie wollen, müssen Sie den Druckauftrag zu unterbrechen Managementobject Wie ManageBaseObject konvertieren ManageObject

Printjob EVENT LISTENER CODE

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(); 

MAIN ACTION CODE

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

         } 
} 

pausieren der Printjob METHOD 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; 
      } 

der Printjob METHOD 2

zu pausieren
+0

Das ist eine lächerliche Menge an Code, um eine einfache Sache zu erreichen. Nick Westgate's Antwort ist genau richtig. –

Antwort

2

WMI ist zu langsam dafür. Sie müssen wahrscheinlich FindFirstPrinterChangeNotification und FindNextPrinterChangeNotification verwenden.

Sie könnten theseexamplesuseful finden.

+0

Wir haben 50 Netzwerkdrucker und 200 Clients (bedeutet Benutzer) und einen Druckserver ..... Die Client-Maschine mit in jedem Netzwerkdrucker drucken .. wie die 50 Maschine zu dem Zeitpunkt zu überwachen, wenn Client klicken, um zu drucken .. –

+1

Ich bin mir nicht ganz sicher, ob ich dich verstehe. Wenn der Druck nicht über den Druckserver erfolgt, benötigen Sie Ihre Software auf dem Client. Wenn Sie auf dem Server sind, müssen Sie mehrere Drucker überwachen. Der zweite Beispiellink, den ich Ihnen gegeben habe, deckt dies ab. Es hat einen Thread-Thread, der auf jedem Benachrichtigungs-Handle wartet. Die andere Möglichkeit besteht darin, ein Array von Benachrichtigungs-Handles zu haben und auf alle zu warten. –

+0

Ya ich sah das Beispiel Link .. aber sie pausieren den Drucker und dann den Drucker wieder .... das ist nur verwirrt ... Angenommen, der erste Benutzer verwenden bereits den Drucker und der zweite Benutzer möchte den gleichen Drucker verwenden ... Ok ... Wird wieder lesen ... @ Nick.am sehr Anfänger in Windows-Anwendung ... so .. ich stucked überall –

Verwandte Themen