Определение принтера, заданий печати, кол-во страниц......все это определяю с помощью WMI, но как сделать событийную модель.........В данном случае, через определеные моменты времени, запускаю функцию, она опреляет есть задания на печать или нет. Но такой способ, грузит ресурсы комп-ра. В 2000 и ХР нет системного сообщения, которое возникает при посылки заданий на печать (98 и МЕ).
МСДН советует использовать две айпишки, которые определяют состояние принтера, но мне это не подходит, как отследить момент посылки на печать в ХР
В WMI Я не силён, но, насколько я знаю, там тоже есть какие-то
события.. Сейчас гляну в MSDN.
Гм.. Поиск вести нереально, особенно, если точно не знаешь, что
искать.. Ищем в форуме gotdotnet.ru..
Ага! Нашёл:
-------------------
>Нужно, всего-навсего, отследить добавление заданий на выбранный
принтер.
На API без проблем всё делал, а с WMI только знакомлюсь, очень непонятен
смысл QUERY в примере...
Это строка запроса на языке WQL (расширение SQL для WMI).
часть строки:
SELECT * FROM __InstanceDeletionEvent WITHIN 1
говорит о том, что нас будут интересовать события удаления экземпляров
наблюдаемого класса, причем проверку на удаление необходимо делать
каждую секунду (указывается при помощи WITHIN 1)
Теперь оставшаяся часть строки - условие запроса:
WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = '" +
APPLICATION_NAME +"'"
Класс __InstanceDeletionEvent является наследником
__InstanceOperationEvent, соответственно он наследует все его поля, в
том числе и TargetInstance, которое является копией удаленного
экземпляра наблюдаемого класса (в том примере это Win32_Process). Исходя
из этого -
WHERE TargetInstance ISA 'Win32_Process'
это требование выбрать те строки, в которых удаляемый экземпляр является
наследником класса Win32_Process (знаете, в ООП отношения между классами
выражают "is a", "has a" ? - здесь мы имеем дело с наследованием - ISA).
Если Вас будут интересовать события изменения состояния (свойств)
каких-то объектов - используйте класс __InstanceModificationEvent, у
которого, в добавок, есть еще и поле PreviousInstance, с копией объекта
перед его изменением.
В части строки
AND TargetInstance.Name = '" + APPLICATION_NAME +"'"
происходит уточнение условия, где говорится что нас интересуют
экземпляры у которых свойство Win32_Process.Name равно APPLICATION_NAME.
Ну и так далее - можно делать уточнений сколько нужно.
Теперь к Вашей задаче - в тот пример вместо __InstanceDeletionEvent
подставьте __InstanceCreationEvent и вместо Win32_Process -
Win32_PrintJob. И конечно отредактируйте/удалите как Вам нужно
оставшуюся часть запроса.
-------------------