![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перехват запроса отправки на печать [D6, WinXP]
Viper_Omsk © (2006-12-05 16:12:00)Всем привет!
Такая проблема: при отправки какого-либо документа на печать необходимо зафиксировать дата и время этого события, получить имя пользователя и информацию от этом файле (тип, размер и т.д.). Помоги кто чем может! :-)
Viper_Omsk (2006-12-14 15:33:00) [1]Ещё один вопросик по теме: как можно получить информацию о количестве копий для каждого документа, отправленного на печать? В библиотеке Printers есть функция GetNumCopies, но компилятор постоянно ругается на неё.
Германн (2006-12-10 00:52:00) [2]
> Подскажите неопытному ещё такой момент: что нужно добавить
> в нижеприведённый исходник чтобы получить путь к файлу,
> который отправлен на печать?
Файлы уже давно никто не отправляет на печать. На печать отправляют документы! А они не обязательно связаны с каким-либо файлом. Имхо.
Viper_Omsk (2006-12-09 19:11:00) [3]Огромное спасибо!! Подскажите неопытному ещё такой момент: что нужно добавить в нижеприведённый исходник чтобы получить путь к файлу, который отправлен на печать?
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;
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;
Сергей И (2006-12-05 17:00:00) [4]С ходи сюда. Есть примеры как читать очередь печати www.delphirus.com.ru
tesseract (2006-12-05 16:22:00) [5]В winXP/Win2003 можно настроить, чтобы всё это отражалось в журнале событий и читать оттуда.