Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Отслеживание очереди принтера (число прочтений - 2780 )
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Отслеживание очереди принтера
07. Ноября 2006 :: 09:48
Печать  
В продолжение темы Отследить печать документа.

Нет желающих потестить вариант с использованием WMI?
В глобальник вставляем следующий
Код
Выбрать все
Перем Обработчик, ОбработчикСобытий,objWMIServices;

Процедура ПриНачалеРаботыСистемы()
	ЗагрузитьВнешнююКомпоненту("EventProxy.dll");
	ОбработчикСобытий=СоздатьОбъект("Addin.EventProxy");
	ОбработчикСобытий.ГлубинаБуфераСобытий=200;
	Обработчик=СоздатьОбъект("WbemScripting.SWbemSink");
	ОбработчикСобытий.Источник(Обработчик,"WbemScripting.SWbemSink","WMISink");
	personate}!\\.\root\CIMV2");
	Shell=СоздатьОбъект("WScript.Shell");
	Env=Shell.Environment("Process");
	objWMIServices.ExecNotificationQueryAsync(Обработчик,
	"SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_PrintJob'
	|AND TargetInstance.Owner='"+Env.Item("UserName")+"'");
КонецПроцедуры	// ПриОткрытии

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
	Если (Источник="WMISink") и (Событие="OnObjectReady") Тогда
		Д=ЗначениеИзСтрокиВнутр(Данные);
		WMIObj=ОбработчикСобытий.ПолучитьОбъект(Д.ПолучитьЗначение(1));
		ИмяСобытия=WMIObj.SystemProperties_.Item("__Class").Value;
		Job=WMIObj.TargetInstance;
		Если ИмяСобытия="__InstanceDeletionEvent" Тогда
			Если Job.PagesPrinted=Job.TotalPages Тогда
				Сообщить("Документ "+Job.Document+" напечатан");
			Иначе
				Сообщить("Документ "+Job.Document+" не напечатан","!!!");
			КонецЕсли;
		КонецЕсли;
		Сообщить("Name:"+Job.Name);
		Сообщить("Caption:"+Job.Caption);
		Сообщить("Description:"+Job.Description);
		Сообщить("Document:"+Job.Document);
		Сообщить("Owner:"+Job.Owner);
		Сообщить("TotalPages:"+Job.TotalPages);
		Сообщить("StartTime:"+Job.StartTime);
		Сообщить("HostPrintQueue:"+Job.HostPrintQueue);
		Сообщить("JobStatus:"+Job.JobStatus);
		Сообщить("Size:"+Job.Size);
		Сообщить("Status:"+Job.Status);
		Сообщить("StatusMask:"+Job.StatusMask);
		Сообщить("PagesPrinted:"+Job.PagesPrinted);
		Сообщить("JobId:"+Job.JobId);
	КонецЕсли;
КонецПроцедуры	// ОбработкаВнешнегоСобытия
 


События возникают при постановке задания в очередь, удалении из очереди, изменении статуса задания.
В зависимости от текущих региональных установок значение свойства status может отличаться.
Свойство StatusMask - битовая маска:
Value Meaning
0x1 Paused
0x2 Error
0x4 Deleting
0x8 Spooling
0x10 Printing
0x20 Offline
0x40 Paperout
0x80 Printed
0x100 Deleted
0x200 Blocked_DevQ
0x400 User_Intervention_Req
0x800 Restart

Свойство JobID однозначно идентифицирует задание в очереди.

ЗЫ: EventProxy.dll брать тут
« Последняя редакция: 11. Ноября 2006 :: 10:11 - steban »  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Отслеживание очереди принтера
Ответ #1 - 07. Ноября 2006 :: 10:46
Печать  
Может кто-нибудь выложить сюда содержимое окна сообщений после успешной печати?
интересует момент удаления задания из очереди (__InstanceDeletionEvent) при успешной печати.
Живого принтера сейчас под рукой нету, а от Microsoft Office Document Image Writer вообще никаких событий не приходит Печаль
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Отслеживание очереди принтера
Ответ #2 - 07. Ноября 2006 :: 10:53
Печать  
steban писал(а) 07. Ноября 2006 :: 10:46:
от Microsoft Office Document Image Writer вообще никаких событий не приходит Печаль

от FinePrint pdfFactory то же самое
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Отслеживание очереди принтера
Ответ #3 - 07. Ноября 2006 :: 13:41
Печать  
А у тебя вообще срабатывает событие?
У меня не отлавливает событие, как ни старался...
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Отслеживание очереди принтера
Ответ #4 - 09. Ноября 2006 :: 08:34
Печать  
Arta писал(а) 07. Ноября 2006 :: 13:41:
У меня не отлавливает событие, как ни старался...

Икс его знает.
При случае буду пробовать на других компьютерах.

Попробовал я с живым принтером.
При удалении задания из очереди если Job.PagesPrinted=Job.TotalPages, то с вероятностью почти 100% документ напечатан Улыбка
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Отслеживание очереди принтера
Ответ #5 - 09. Ноября 2006 :: 08:39
Печать  
Человеческой работы на терминале я так и не добился. На мою печать не срабатывает, а на печать с другой сессии сработал.
Кроме того спулинг жрал много ресурсов во время отлова событий.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать