Как приостановить Win32_printJob с помощью Printername и JobID
ЗАДАЧА
Когда пользователь распечатает документ, появится пауза, а затем заполните форму, нажмите кнопку, введите форму, и работа будет возобновлена.
У нас есть 50 сетевых принтеров, 2000 клиентских компьютеров и один сервер печати.
У КАЖДОГО КЛИЕНТА было 3 или 4 принтера
ПРОБЛЕМА
Если пользователь печатает документ локально (например, PDF PRINTER, XPS DOCUMENT WRITER) (или) с помощью сетевого принтера (CANON,HP), задание на печать было немедленно приостановлено.
МОИ ПРОБЫ
При распечатке любого документа слушатель событий наблюдает и возвращает задание на печать.
В методе первой паузы иногда работают и большую часть времени не работает должным образом. Потому что, он ищет задание на печать, но его нет там уже напечатано.
Во втором методе паузы не работает, потому что слушатель события возвращает объект Managementbaseobject, но если необходимо приостановить задание печати, необходимо ManagementObject Как преобразовать ManageBaseObject в 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();
ОСНОВНОЙ КОД ДЕЙСТВИЙ
private void printJobArrived_EventArrived(object sender, EventArrivedEventArgs e)
{
try
{
CurrentprintJob = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value;
}
catch(Exception ex){
}
}
ПРИОСТАНОВИТЬ МЕТОД ПЕЧАТИ 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;
}
1 ответ
WMI слишком медленный для этого. Возможно, вам нужно использовать FindFirstPrinterChangeNotification и FindNextPrinterChangeNotification.
Наконец, я нашел решение на официальном веб-сайте документации MSDN для управления принтером, вот ссылка: https://www.codeproject.com/Articles/6592/A-Simple-Approach-for-Controlling-Print-Jobs-using
Это показывает, что как Pause
, Resume
а также Delete
задание на печать. Основной класс Win32_PrintJob
, Переменная printJob
из ManagementObjectSearcher
объект, который искал один экземпляр принтера.
printJob.InvokeMethod("Pause", null);
printJob.InvokeMethod("Resume", null);
printJob.Delete()
Я все еще обнаружил, что его реализация на Python кода: http://timgolden.me.uk/python/wmi/cookbook.html
import wmi
c = wmi.WMI ()
print_job_watcher = c.Win32_PrintJob.watch_for (
notification_type="Creation",
delay_secs=1
)
while 1:
pj = print_job_watcher ()
print "User %s has submitted %d pages to printer %s" % \
(pj.Owner, pj.TotalPages, pj.Name)