Форум: "WinAPI";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];
Внизкол-во страниц отправленых на принтер Найти похожие ветки
← →
ted (2002-05-12 19:43) [0]Подскажите, как подсчитать кол-во страниц отправленых на принтер?
Заранее благодарен.....
← →
Konorl (2002-05-12 20:26) [1]Сам не делал, но считаю, что с помощью функции GetJob
определите JOB_INFO_1, с этой структуре есть количество страниц
документа TotalPages. Необходимо сначало открыть нужный принтер OpenPrinter на нужном JobId.
← →
ted (2002-05-12 21:55) [2]> Konorl
Спасибо за совет, вот код, но он выдает ошибку, не могу понять в чем дело.......8(
Ошика звучит так: incompatible types "Cardinal" and "PDWORD"
Пробовал менять dwNeeded1 : DWORD; на dwNeeded1 : cardinal; все равно не фурычит. Помогите разоблаться, плиз......
var
hPrinter : THandle;
PD : TPrinterDefaults;
JI2 : PjobInfo2;
dwNeeded1 : DWORD;
begin
ji2:=nil;
OpenPrinter(PChar(GetPrinterName), hPrinter, @PD);
getjob(hPrinter,0,2,JI2,0, dwNeeded1);
← →
Anatoly Podgoretsky (2002-05-12 22:20) [3]getjob(hPrinter,0,2,JI2,0, @dwNeeded1);
← →
ted (2002-05-13 01:44) [4]Попробовал все здорово только количество страниц все время 0.
Что в этом коде не так, подскажите, плиз???????
procedure TForm1.GetInfo100;
var
hPrinter : THandle;
PD : TPrinterDefaults;
JI2 : PjobInfo2;
dwNeeded1 : dword;
begin
Memo5.Lines.Clear;
ji2:=nil;
// Узнаем реальный размер структуры
OpenPrinter(PChar(GetPrinterName), hPrinter, @PD);
getjob(hPrinter,0,2,JI2,0, @dwNeeded1);
// Выделим память
hGlobal := GlobalAlloc(GHND, DWNEEDED1);
JI2 := PJobInfo2(GlobalLock(hGlobal));
// Отобразим ее
with Memo5.Lines, JI2^ do
begin
Add("TotalPages = " + IntToStr(TotalPages));
end;
// Освободим память
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
end;
← →
ted (2002-05-13 07:02) [5]Помогите разобраться, плиз...........
← →
Konorl (2002-05-13 17:21) [6]Не претендую на истину, попробу так:
procedure TForm1.CountOrdersPrinter;
var
hPrinter,hGlobal: THandle;
JobId, cbBuf, dwNeeded: Cardinal;
JB1: PJOBINFO1;
PD: TPrinterDefaults;
function GetPrinterName: String;
var
Buffer: Array[0..255] of Char;
S: String;
begin
GetProfileString("windows", "device", ",,,", buffer, 256);
S:=StrPas(Buffer);
Result:=Copy(S, 1, Pos(",", S)-1);
end;
begin
OpenPrinter(PChar(GetPrinterName), hPrinter, @PD);
hGlobal := GlobalAlloc(GHND, dwNeeded);
JB1:= PJOBINFO1(GlobalLock(hGlobal));
cbBuf:=255;
for JobId:=1 to 255 do
if GetJob(hPrinter, JobId, 1, JB1, cbBuf, @dwNeeded) then
Label1.Caption:=inttostr(JB1.TotalPages);
ClosePrinter(hPrinter);
end;
Покажет кол. страниц первого задания принтера по умолчанию.
Если дальше в лес - доделывай сам.
← →
Konorl (2002-05-13 17:27) [7]Забыл
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
и написать вылет после лабель.
← →
ted (2002-05-25 22:33) [8]Помогите, плиз...
Бьюсь уже вторую неделю, все препробовал не могу наити ошибку...
Все время показывает в первом задании 16 страниц, а в остальных 0....
procedure TForm1.GetInfo100;
var
hPrinter,hGlobal: THandle;
JobId, cbBuf, dwNeeded: Cardinal;
JB2: PJOBINFO2;
PD: TPrinterDefaults;
begin
Memo5.Lines.Clear;
OpenPrinter(PChar(GetPrinterName), hPrinter, @PD);
hGlobal := GlobalAlloc(GHND, dwNeeded);
JB2:= PJOBINFO2(GlobalLock(hGlobal));
cbBuf:=255;
i:="";
for JobId:=0 to 255 do
if GetJob(hPrinter, JobId, 2, JB2, cbBuf, @dwNeeded) then
With Memo5.Lines, JB2^ do
begin
Add("Dokument name = " + pDocument);
Add("User name = " + pUserName);
Add("PagesPrinted = " + inttostr(PagesPrinted));
Add("TotalPages = " + inttostr(TotalPages));
end;
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
end;
← →
ted (2002-05-26 13:26) [9]Помогите плиз, очень нужно......
← →
RV (2002-05-27 13:50) [10]Ну вот как я делаю ....
uses ...winspool...
function GetEnumeratedPrinterPorts: String;
var
sl: TStringlist;
Buffer, PrinterInfo: PChar;
Flags, Count, NumInfo: DWORD;
I,j: Integer;
PrinterHandle:tHandle;
ZadachiPrintera : array [0..20] of TJobInfo2;
ByteRez,StructCount : DWORD;
Stroka : String;
begin
Result := "";
if Win32Platform = VER_PLATFORM_WIN32_NT then
Flags := PRINTER_ENUM_CONNECTIONS or PRINTER_ENUM_LOCAL
else
Flags := PRINTER_ENUM_DEFAULT or 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;
sl:= TStringlist.Create;
stroka:="";
try
for I := 0 to NumInfo - 1 do
with PPrinterInfo2(PrinterInfo)^ do
begin
//
← →
RV (2002-05-27 15:40) [11]В догонку
про Как узнать что задание пошло на принтер?
пока у меня прога по таймеру ловит, т.к.
procedure WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS); message WM_SPOOLERSTATUS;
так и не срабатывает, впечатление что нет сообщения WM_SPOOLERSTATUS
как сделать что бы процедурка срабатывала именно тогда, когда задание добавится (удалится) из списка задач принтера
а то некрасиво получается
← →
jedi (2002-05-27 17:24) [12]Mne stalo interesno i ya atcril MSDN i vot 4to tam nashel:
-------------------------------------------------------------
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.
Windows 2000/XP: The WM_SPOOLERSTATUS message is not sent. 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
ya proveril v win9x sobshenie posilaetsea, a dlea win2000/xp pridetsea delat" kak v primere iz MSDN.
Best regards!
← →
RV (2002-05-28 12:23) [13]Приветствую всех!
Приветствую jedi!
не понятно несколько...можно на делфях пример?
я начинающий - не понятно как это работает
вот с сообщением WM_SPOOLERSTATUS понятно - ну типа прога подписалась на него, тебе дальше пофигу - процедурка сработает когда надо
а сдесь как?
HANDLE FindFirstPrinterChangeNotification(
HANDLE hPrinter, // handle to printer or print server to monitor for changes
DWORD fdwFlags, // flags that specify the conditions to monitor
DWORD fdwOptions, // reserved, must be zero
LPVOID pPrinterNotifyOptions // pointer to structure specifying printer information to monitor
);
Parameters
hPrinter
Handle to the printer or print server that you want to monitor. This handle is obtained by calling the OpenPrinter function.
т.е. надо OpenPrinter вызывать. периодично что-ли?
]да, тогда что же, опять таймер нужен? толков тогда от нее (повторю, можть я не понимаю чего - объяните бестолковому)
]нет, тогда я вот как раз вообще не понимаю....
плз, хелп! не кодом, так хоть пояснением механизма работы этого дела
СПАСИБО заранее
← →
ted (2002-05-31 15:04) [14]Всем привет!
> RV
Я нарыл вот такую прогу, она срабатывает, когда задание идет на печать, и показывает сколько заданий отправлено.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
procedure WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS);
message WM_SPOOLERSTATUS;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS);
begin
Label1.Caption := IntToStr(msg.JobsLeft) +
" Jobs currenly in spooler";
msg.Result := 0;
end;
end.
← →
ted (2002-05-31 15:05) [15]> RV
Попробую соединить, если получиться вышлю на мыло.
← →
RV (2002-05-31 15:42) [16]всех поздравляю с моим днем рождения!
>to ted
Я же г-рю выше,
procedure WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS); message WM_SPOOLERSTATUS;
так и не срабатывает
винда потому что, как г-рит jedi, 2000.
и енто правильно (не посылается там енто сообщение).
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c