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;
}
zu pausierender Printjob METHOD 2
Das ist eine lächerliche Menge an Code, um eine einfache Sache zu erreichen. Nick Westgate's Antwort ist genau richtig. –