Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как прочитать очередь печати

Delphi , ОС и Железо , Принтеры и Печать



Автор: http://www.swissdelphicenter.ch

uses
  Winspool, Printers;

function GetCurrentPrinterHandle: THandle;
var
  Device, Driver, Port: array[0..255] of Char;
  hDeviceMode: THandle;
begin
  Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
  if not OpenPrinter(@Device, Result, nil) then
    RaiseLastWin32Error;
end;

function SavePChar(p: PChar): PChar;
const
  error: PChar = 'Nil';
begin
  if not Assigned(p) then
    Result := error
  else
    Result := p;
end;

procedure TForm1.Button1Click(Sender: TObject);
type
  TJobs = array[0..1000] of JOB_INFO_1;
  PJobs = ^TJobs;
var
  hPrinter: THandle;
  bytesNeeded, numJobs, i: Cardinal;
  pJ: PJobs;
begin
  hPrinter := GetCurrentPrinterHandle;
  try
    EnumJobs(hPrinter, 0, 1000, 1, nil, 0, bytesNeeded,
      numJobs);
    pJ := AllocMem(bytesNeeded);
    if not EnumJobs(hPrinter, 0, 1000, 1, pJ, bytesNeeded,
      bytesNeeded, numJobs) then
      RaiseLastWin32Error;

    memo1.Clear;
    if numJobs = 0 then
      memo1.Lines.Add('No jobs in queue')
    else
      for i := 0 to Pred(numJobs) do
        memo1.Lines.Add(Format('Printer %s, Job %s, Status (%d): %s',
          [SavePChar(pJ^[i].pPrinterName), SavePChar(pJ^[i].pDocument),
          pJ^[i].Status, SavePChar(pJ^[i].pStatus)]));
  finally
    ClosePrinter(hPrinter);
  end;
end;

Программа на Delphi для чтения очереди печати принтера использует Windows API для достижения этого.

Вот разбивка каждого части кода:

  1. Функция GetCurrentPrinterHandle возвращает handle текущего по умолчанию принтера.
  2. Функция SavePChar - вспомогательная функция, которая конвертирует PChar (указатель на null-terminated строку) в PChar. Если входной PChar равен nil, она возвращает hardcoded сообщение об ошибке.
  3. Процедура Button1Click - обработчик события клика кнопки на форме. Она делает следующее:
    • Получает handle текущего по умолчанию принтера, используя GetCurrentPrinterHandle.
    • Перечисляет печатные задачи в очереди, используя функцию API EnumJobs. Это возвращает количество задач и их размеры.
    • Выделяет память для хранения информации о задачах и вызывает EnumJobs снова, чтобы заполнить ее данными о задачах.
    • Если в очереди нет задач, она отображает сообщение об этом. Иначе, она перебирает массив задач и добавляет детали каждой задачи в текстовое поле на форме.

Вывод этой программы будет списком имен принтеров, имен документов и статусов для каждого задания в очереди печати.

Для чтения очереди печати программа использует функцию API EnumJobs. Эта функция принимает несколько параметров: * hPrinter: Handle принтера, чьи задачи вы хотите перечислить. * Flags: Сет флагов, которые контролируют процесс перечисления. В этом случае он установлен в 1, что означает, что мы интересуемся всеми задачами. * MinJob: Минимальный ID задачи для начала перечисления. Мы не используем этот параметр. * MaxJob: Максимальный ID задачи для остановки перечисления. Мы также не используем этот параметр. * pJobs: Указатель на буфер, который будет содержать информацию о задачах. * cbBuf: Размер буфера в байтах. * pcbNeeded: Указатель на переменную, которая получает фактическое количество байт, необходимое для информации о задачах.

Повторяя вызов EnumJobs с этими параметрами, мы можем получить информацию о задачах и хранить ее в нашем буфере памяти. Затем мы перебираем этот буфер, чтобы извлечь и отобразить желаемую информацию.

В статье описывается алгоритм чтения очереди печати в Windows с помощью языка программирования Delphi, используя функции EnumJobs и GetCurrentPrinterHandle.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Принтеры и Печать ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 16:44:14/0.0031960010528564/0