Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.041 c
1-1119362054
dfkghasdlkgjh
2005-06-21 17:54
2005.07.11
событе на открытие/закрытие проги.


11-1101890410
<Falcon>
2004-12-01 11:40
2005.07.11
Битые ссылки?


14-1118203605
lookin
2005-06-08 08:06
2005.07.11
Восстановить нетекстовый файл, отредактированный в Блокнот


1-1118393065
Салават
2005-06-10 12:44
2005.07.11
путьк файлу


10-1095323969
zenit
2004-09-16 12:39
2005.07.11
Как добраться до событий MS Word из Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский