Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Получить заголовок документа в спулере печати   Найти похожие ветки 

 
TriboSM   (2005-05-10 11:08) [0]

Ув. мастера. Хочу наваять программу слежения за печатным траффиком. Перехват добавления задания в спулер можно реализовать через WM_SPOOLERSTATUS. Там же можно взять количество заданий. А как можно вытянуть из спулера список заданий и желательно с количеством страниц для каждого?

Заранее спасибо.


 
TriboSM   (2005-05-10 15:03) [1]

.


 
TriboSM   (2005-05-11 09:46) [2]

Сам нашел. Оставляю информацию - может кому еще понадобиться.

Как получить информацию о заданиях на принтере

В Windows существуют встроенные средства для мониторинга заданий на принтере. Однако, давайте разберёмся, как отслеживать задания на принтере программно. Для существует API функция "EnumJobs", которая позволяет получить давольно много информации о текущем состоянии принтера (Имя задания, Состояние, дату, время и т.д.).

Ниже представлена функция, которая использует EnumJobs и возвращает массив структуры, в котором представлена вся необходимая информация:

uses WinSpool;

type
 JOB_INFO_1_ARRAY = array of 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);
 if not bResult then
 begin
   ShowMessage("Error opening the printer");
   exit;
 end;

 bResult := EnumJobs(hPrinter, 0, Length(aJobs), 1, @aJobs, cbBuf, pcbNeeded,
   pcReturned);
 if not bResult then
 begin
   ShowMessage("Error Getting Jobs information");
   exit;
 end;

 ClosePrinter(hPrinter);

 for i := 0 to pcReturned - 1 do
 begin
   if aJobs[i].pDocument <> nil then
   begin
     SetLength(Result, Length(Result) + 1);
     Result[Length(Result) - 1] := aJobs[i];
   end;
 end;
end;



Пример использования:

Создайте новый проект со StringGrid и Timer.
В StringGrid установите свойства “ColCount” и “RowCount” в 20.
У таймера (Timer) установите свойство “Interval” в 500.
В обработчик события “OnTime” таймера добавьте следующий код:

procedure TForm1.Timer1Timer(Sender: TObject);
var
 i, ii: Integer;
 aJobs: JOB_INFO_1_ARRAY;
begin
 for i := 0 to StringGrid1.ColCount - 1 do
   for ii := 0 to StringGrid1.RowCount - 1 do
     StringGrid1.Cells[i, ii] := "";

 aJobs := GetSpoolerJobs("HP LaserJet 6L PCL");

 for i := 0 to Length(aJobs) - 1 do
 begin
   StringGrid1.Cells[i, 0] := aJobs[i].pPrinterName;
   StringGrid1.Cells[i, 1] := aJobs[i].pMachineName;
   StringGrid1.Cells[i, 2] := aJobs[i].pUserName;
   StringGrid1.Cells[i, 3] := aJobs[i].pDocument;
   StringGrid1.Cells[i, 4] := aJobs[i].pDatatype;
   StringGrid1.Cells[i, 5] := aJobs[i].pStatus;
   StringGrid1.Cells[i, 6] := IntToStr(aJobs[i].Status);

   case aJobs[i].Status of
     JOB_STATUS_PAUSED: StringGrid1.Cells[i, 6] := "JOB_STATUS_PAUSED";
     JOB_STATUS_ERROR: StringGrid1.Cells[i, 6] := "JOB_STATUS_ERROR";
     JOB_STATUS_DELETING: StringGrid1.Cells[i, 6] := "JOB_STATUS_DELETING";
     JOB_STATUS_SPOOLING: StringGrid1.Cells[i, 6] := "JOB_STATUS_SPOOLING";
     JOB_STATUS_PRINTING: StringGrid1.Cells[i, 6] := "JOB_STATUS_PRINTING";
     JOB_STATUS_OFFLINE: StringGrid1.Cells[i, 6] := "JOB_STATUS_OFFLINE";
     JOB_STATUS_PAPEROUT: StringGrid1.Cells[i, 6] := "JOB_STATUS_PAPEROUT";
     JOB_STATUS_PRINTED: StringGrid1.Cells[i, 6] := "JOB_STATUS_PRINTED";
     JOB_STATUS_DELETED: StringGrid1.Cells[i, 6] := "JOB_STATUS_DELETED";
     JOB_STATUS_BLOCKED_DEVQ: StringGrid1.Cells[i, 6] :=
       "JOB_STATUS_BLOCKED_DEVQ";
     JOB_STATUS_USER_INTERVENTION: StringGrid1.Cells[i, 6] :=
       "JOB_STATUS_USER_INTERVENTION";
     JOB_STATUS_RESTART: StringGrid1.Cells[i, 6] := "JOB_STATUS_RESTART";
     JOB_POSITION_UNSPECIFIED: StringGrid1.Cells[i, 6] :=
       "JOB_POSITION_UNSPECIFIED";

   else
     StringGrid1.Cells[i, 6] := "Unknown status...";
   end;
 end;

 StringGrid1.Refresh;
end;



Запустите проект и попробуйте что-нибудь отправить на печать из MSWord или другого приложения и посмотрите в stringgrid.
Некоторые замечания и дополнения:

Структура JOB_INFO_1 объявлена в юните WinSpool следующим образом:

JOB_INFO_1 = record
 JobId: DWORD;
 pPrinterName: PAnsiChar;
 pMachineName: PAnsiChar;
 pUserName: PAnsiChar;
 pDocument: PAnsiChar;
 pDatatype: PAnsiChar;
 pStatus: PAnsiChar;
 Status: DWORD;
 Priority: DWORD;
 Position: DWORD;
 TotalPages: DWORD;
 PagesPrinted: DWORD;
 Submitted: TSystemTime;
end;



И массив так же можно объявить следующим образом:

aJobs: array[0..99] of JOB_INFO_1;





--------------------------------------------------------------------------------

Copyright ©   "DELPHI WORLD"   E-mail:   delphiworld@mail.ru  http://www.delphiworld.narod.ru
Источник получения информации: http://www.delphiworld.narod.ru



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.051 c
14-1118483939
NightStranger
2005-06-11 13:58
2005.07.11
Где скачать последнюю версию RxLib?


1-1118827391
Mortal
2005-06-15 13:23
2005.07.11
Ошибка в USER.EXE. {Волщебство}


10-1095829748
AleKo
2004-09-22 09:09
2005.07.11
Удаление из системы DCOM сервера


14-1118405773
TUser
2005-06-10 16:16
2005.07.11
Угадайка


11-1101251725
XProger
2004-11-24 02:15
2005.07.11
Старнная ошибка в RichEdit1