Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.01 c
1-98645
dream
2003-10-17 12:21
2003.10.30
поставил новый компонент и решил посмотреть demo , и тут начались


7-98909
Jakommo
2003-08-20 10:10
2003.10.30
Ошибка 1053 при запуске сервиса.


11-98533
Kladov
2003-02-12 16:57
2003.10.30
Просьба посмотреть на DoubleBuffered/Transparent


1-98542
Vadim S
2003-10-20 16:36
2003.10.30
MessageDlg ?mbNo?


4-98943
Slym
2003-08-27 09:39
2003.10.30
Визуальный строитель диалогов...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский