Comment mettre en pause le Win32_printJob par Printername et JobID

TÂCHE

Lorsque l’utilisateur imprime le document, le pop-up apparaîtra puis remplira le formulaire, cliquera sur entrer, le formulaire sera fermé et le travail a été repris.

Nous avons 50 imprimantes réseau , 2000 machines clientes et un serveur d’impression .

CHAQUE CLIENT avait 3 ou 4 imprimantes

PROBLÈME

Si l’utilisateur imprime le document localement (EX: IMPRIMANTE PDF, XPS DOCUMENT WRITER) (ou) à l’aide d’une imprimante réseau (CANON, HP), le travail d’impression a été immédiatement mis en pause.

Mes essais

Lorsque vous imprimez un document, l’écouteur surveille et renvoie le travail d’impression .

  • Dans First Pause, la méthode fonctionne parfois, mais la plupart du temps, elle ne fonctionne pas correctement.Parce que sa recherche de la job d’impression, mais qu’elle n’y est pas déjà imprimée.

  • Dans Second Pause, la méthode ne fonctionne pas car l’écouteur d’événements renvoie l’object Managementbaseobject mais si vous souhaitez suspendre le travail d’impression, vous devez disposer de l’outil ManagementObject. Comment convertir ManageBaseObject en outil ManageObject

CODE D’ÉDITIF D’ÉVÉNEMENT D’ÉVÉNEMENT D’IMPRESSION

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

CODE D’ACTION PRINCIPAL

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

PAUSE DE LA MÉTHODE PRINTJOB 1

  public bool PausePrintJob(ssortingng jobname) { bool isActionPerformed = false; try { ssortingng 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; } 

PAUSE DE LA METHODE PRINTJOB 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; } 

WMI est trop lent pour cela. Vous devrez probablement utiliser FindFirstPrinterChangeNotification et FindNextPrinterChangeNotification .

Vous pourriez trouver ces exemples utiles .