Форум: "Система";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];
ВнизШпион за печатью Найти похожие ветки
← →
V-A-V (2003-08-07 14:51) [0]Доброе время суток всем.
Поставлена задача подсчитать сколько листов бумаги было намечатано за день с данной машины и на какой принтер.
Народ подскажите пожалуйста как это можно реализовать. Накидал кусок кода, вроде все нормально да только функция FindFirstPrinterChangeNotification вертает лажу под Win98, а под Win2000 происходят странные вещи прога, как и впрочем сам менеджер печати вертает лажу, если допустим посылать на печать одну страницу то выаается что печатается 8 или 9, а на некоторых машинах с Win2000 вообше 19.
Как с этим боротся. Может кто примерчик кинет...
← →
Jedi K (2003-08-07 15:41) [1]WM_SPOOLERSTATUS
The WM_SPOOLERSTATUS message is sent from Print Manager whenever a job is added to or removed from the Print Manager queue.
A window receives this message through its WindowProc function.
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_SPOOLERSTATUS
WPARAM wParam, // job status
LPARAM lParam ( hPrinter, PRINTER_CHANGE_JOB, 0, NULL) WM_SPOOLERSTATUS
The WM_SPOOLERSTATUS message is sent from Print Manager whenever a job is added to or removed from the Print Manager queue.
A window receives this message through its WindowProc function.
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_SPOOLERSTATUS
WPARAM wParam, // job status
LPARAM lParam // number of jobs remaining
);
Parameters
wParam
Specifies the PR_JOBSTATUS flag.
lParam
The low-order word specifies the number of jobs remaining in the Print Manager queue.
Return Values
An application should return zero if it processes this message.
Remarks
This message is for informational purposes only. This message is advisory and does not have guaranteed delivery semantics. Applications should not assume that they will receive a WM_SPOOLERSTATUS message for every change in spooler status.
Note The WM_SPOOLERSTATUS message is not supported after Windows XP. To be notified of changes to the print queue status, use FindFirstPrinterChangeNotification and FindNextPrinterChangeNotification. The following code outlines how this might be done.
HANDLE chgObject;
DWORD *pdwChange;
BOOL fcnreturn;
chgObject = FindFirstPrinterChangeNotification( hPrinter, PRINTER_CHANGE_JOB, 0, NULL);
WaitForSingleObject(chgObject, INFINTE);
fcnreturn = FindNextPrinterChangeNotification(chgObject, pdwChange, NULL, NULL);
if (fcnreturn) {
// check value of *pdwChange and deal with the indicated change
Requirements
Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Winuser.h; include Windows.h.
← →
V-A-V (2003-08-08 08:58) [2]
chgObject = FindFirstPrinterChangeNotification( hPrinter, PRINTER_CHANGE_JOB, 0, NULL);
Не помогает возвращает 0 (под Win98) с вытекающими далее последствиями
← →
Vlad Oshin (2003-08-08 13:04) [3]знаю криво, прошу ногами не бить
function GetEnumeratedPrinterPorts: String;
label 1;
var
Buffer, PrinterInfo: PChar;
Flags, Count, NumInfo: DWORD;
I,j: Integer;
PrinterHandle:tHandle;
ZadachiPrintera : array [0..20] of TJobInfo2;
ByteRez,StructCount : DWORD;
Stroka : String;
procedure PriemZadanie;
var
f:textfile;
begin
form1.CZad:=SystemTimeToDateTime(ZadachiPrintera[j].Submitted);
stroka:="";
Stroka:=Stroka+" Mashine: "+ZadachiPrintera[j].pMachineName;
Stroka:=Stroka+" User: " +ZadachiPrintera[j].pUserName;
Stroka:=Stroka+" Driver: " +ZadachiPrintera[j].pDriverName;
Stroka:=Stroka+" Total pages: " +IntToStr(ZadachiPrintera[j].TotalPages+ZadachiPrintera[j].PagesPrinted);
Stroka:=Stroka+" Document: " +ZadachiPrintera[j].pDocument;
Stroka:=Stroka+" God: " +IntToStr(ZadachiPrintera[j].Submitted.wYear);
Stroka:=Stroka+" Mesyac: " +IntToStr(ZadachiPrintera[j].Submitted.wMonth);
Stroka:=Stroka+" Day: " +IntToStr(ZadachiPrintera[j].Submitted.wDay);
Stroka:=Stroka+" Hour: " +IntToStr(ZadachiPrintera[j].Submitted.wHour);
Stroka:=Stroka+" Minute: " +IntToStr(ZadachiPrintera[j].Submitted.wMinute);
Stroka:=Stroka+" Second: " +IntToStr(ZadachiPrintera[j].Submitted.wSecond);
Stroka:=Stroka+" Milliseconds: " +IntToStr(ZadachiPrintera[j].Submitted.wMilliseconds);
assignfile(f,"prnlog.txt");
//reset(f);
append(f);
writeln(f,stroka);
closefile(f);
end;
begin
Result := "";
Flags := PRINTER_ENUM_LOCAL;
Count := 0;
EnumPrinters(Flags, nil, 2, nil, 0, Count, NumInfo);
if Count = 0 then Exit;
GetMem(Buffer, Count);
try
if not EnumPrinters(Flags, nil, 2, PByte(Buffer), Count, Count, NumInfo) then
Exit;
PrinterInfo := Buffer;
stroka:="";
try
for I := 0 to NumInfo - 1 do
with PPrinterInfo2(PrinterInfo)^ do
begin
OpenPrinter(pPrinterName,PrinterHandle,nil);
if EnumJobs(PrinterHandle,
0,
cJobs,
2,
@ZadachiPrintera,
SizeOf(ZadachiPrintera),
ByteRez,
StructCount)
then if StructCount>0
then for j := 0 to StructCount-1 do begin
//???????????????????
if (SystemTimeToDateTime(ZadachiPrintera[j].Submitted)>form1.CZad)
then PriemZadanie;
end;
Inc(PrinterInfo, sizeof(TPrinterInfo2));
end;
Result := Stroka;
finally
//!!!!!!!!
end;
finally
( Buffer, Count) знаю криво, прошу ногами не бить
function GetEnumeratedPrinterPorts: String;
label 1;
var
Buffer, PrinterInfo: PChar;
Flags, Count, NumInfo: DWORD;
I,j: Integer;
PrinterHandle:tHandle;
ZadachiPrintera : array [0..20] of TJobInfo2;
ByteRez,StructCount : DWORD;
Stroka : String;
procedure PriemZadanie;
var
f:textfile;
begin
form1.CZad:=SystemTimeToDateTime(ZadachiPrintera[j].Submitted);
stroka:="";
Stroka:=Stroka+" Mashine: "+ZadachiPrintera[j].pMachineName;
Stroka:=Stroka+" User: " +ZadachiPrintera[j].pUserName;
Stroka:=Stroka+" Driver: " +ZadachiPrintera[j].pDriverName;
Stroka:=Stroka+" Total pages: " +IntToStr(ZadachiPrintera[j].TotalPages+ZadachiPrintera[j].PagesPrinted);
Stroka:=Stroka+" Document: " +ZadachiPrintera[j].pDocument;
Stroka:=Stroka+" God: " +IntToStr(ZadachiPrintera[j].Submitted.wYear);
Stroka:=Stroka+" Mesyac: " +IntToStr(ZadachiPrintera[j].Submitted.wMonth);
Stroka:=Stroka+" Day: " +IntToStr(ZadachiPrintera[j].Submitted.wDay);
Stroka:=Stroka+" Hour: " +IntToStr(ZadachiPrintera[j].Submitted.wHour);
Stroka:=Stroka+" Minute: " +IntToStr(ZadachiPrintera[j].Submitted.wMinute);
Stroka:=Stroka+" Second: " +IntToStr(ZadachiPrintera[j].Submitted.wSecond);
Stroka:=Stroka+" Milliseconds: " +IntToStr(ZadachiPrintera[j].Submitted.wMilliseconds);
assignfile(f,"prnlog.txt");
//reset(f);
append(f);
writeln(f,stroka);
closefile(f);
end;
begin
Result := "";
Flags := PRINTER_ENUM_LOCAL;
Count := 0;
EnumPrinters(Flags, nil, 2, nil, 0, Count, NumInfo);
if Count = 0 then Exit;
GetMem(Buffer, Count);
try
if not EnumPrinters(Flags, nil, 2, PByte(Buffer), Count, Count, NumInfo) then
Exit;
PrinterInfo := Buffer;
stroka:="";
try
for I := 0 to NumInfo - 1 do
with PPrinterInfo2(PrinterInfo)^ do
begin
OpenPrinter(pPrinterName,PrinterHandle,nil);
if EnumJobs(PrinterHandle,
0,
cJobs,
2,
@ZadachiPrintera,
SizeOf(ZadachiPrintera),
ByteRez,
StructCount)
then if StructCount>0
then for j := 0 to StructCount-1 do begin
//???????????????????
if (SystemTimeToDateTime(ZadachiPrintera[j].Submitted)>form1.CZad)
then PriemZadanie;
end;
Inc(PrinterInfo, sizeof(TPrinterInfo2));
end;
Result := Stroka;
finally
//!!!!!!!!
end;
finally
FreeMem(Buffer, Count);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer1.Enabled:=false;
Application.PROCESSMessages;
GetEnumeratedPrinterPorts;
timer1.Enabled:=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CZad:=0;
end;
← →
Dimich1978 (2003-08-08 13:31) [4]В любом поисковике набери SpyPrinter Delphi. компонент такой типа
← →
bolega (2003-08-12 13:52) [5]http://codecentral.borland.com/codecentral/ccweb.exe/listing?id=20307
← →
Gurban (2003-08-15 11:41) [6]Из собственного многострадального опыта.
WM_SPOOLERSTATUS работает только под 98 и то очень криво, особенно если послали с сети на принтер..
FindFirstPrinterChangeNotification можно использовать но тогда нужно всем ХР или 2000 ставить.
← →
Vorobyev Sergey (2003-08-19 09:11) [7]Посмотри
http://data.emsd.iks.ru/duk/pagecount.htm
поговори с автором,
может поможет...
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c