В Windows существуют встроенные средства для мониторинга заданий на
принтере. Однако, давайте разберёмся, как отслеживать задания на принтере
программно. Для существует API функция "EnumJobs", которая позволяет получить
давольно много информации о текущем состоянии принтера (Имя задания, Состояние,
дату, время и т.д.).
Ниже представлена функция, которая использует EnumJobs и возвращает массив
структуры, в котором представлена вся необходимая информация:
uses WinSpool;
type
JOB_INFO_1_ARRAY = arrayof JOB_INFO_1;
function GetSpoolerJobs(sPrinterName: string): JOB_INFO_1_ARRAY;
var
i: Integer;
hPrinter: THandle;
bResult: Boolean;
cbBuf: DWORD;
pcbNeeded: DWORD;
pcReturned: DWORD;
aJobs: array[0..99] of JOB_INFO_1;
begin
cbBuf := 1000;
bResult := OpenPrinter(PChar(sPrinterName), hPrinter, nil);
ifnot bResult thenbegin
ShowMessage('Error opening the printer');
exit;
end;
bResult := EnumJobs(hPrinter, 0, Length(aJobs), 1, @aJobs, cbBuf, pcbNeeded,
pcReturned);
ifnot bResult thenbegin
ShowMessage('Error Getting Jobs information');
exit;
end;
ClosePrinter(hPrinter);
for i := 0 to pcReturned - 1 dobeginif aJobs[i].pDocument <> nilthenbegin
SetLength(Result, Length(Result) + 1);
Result[Length(Result) - 1] := aJobs[i];
end;
end;
end;
Пример использования:
Создайте новый проект со StringGrid и Timer.
В StringGrid установите свойства “ColCount” и “RowCount” в 20.
У таймера (Timer) установите свойство “Interval” в 500.
В обработчик события “OnTime” таймера добавьте следующий код:
Статья Как получить информацию о заданиях на принтере раздела ОС и Железо Принтеры и Печать может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
:: 2010-09-16 16:30:39 :: re:Как получить информацию о заданиях на принтере
Запустил программу
Выдает
'Error opening the printer'
Понял так, что нужно вставить имя принтера в
OpenPrinter(PChar(sPrinterName), hPrinter, nil) для получения дескриптора.
Как его получить?
:: 2015-12-03 17:00:11 :: re:Как получить информацию о заданиях на принтере
Имя принтера получил.
Но ошибка не ушла. Может быть при запуске Windows принтер "открывается"? По крайней мере , его хендл не равен 0 и его можно получить через вызов
Printer.GetPrinter(Device,Driver,Port,hDeviceMode);
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.