Как отследить количество страниц отправленых на печать?
От: tas Украина www.foss.kharkov.ua
Дата: 28.03.03 09:10
Оценка:
а...ааа ап! крокодилы.... бегимоты....
Re: Как отследить количество страниц отправленых на печать?
От: SergH Россия  
Дата: 28.03.03 12:03
Оценка:
Здравствуйте, tas, Вы писали:

Можно заменить StartDoc (тебе поможет Q&A про перехват функций на rsdn), можно через FingFirstPrinter... (я даже писал подобное, работало, валяется у меня на сайте), можно совместить FingFirstPrinter.. c GetJob. Можно написать принт-процессор (это я тоже делал, тоже работало) но есть ограничения — это под определённую ОС и только для обычных (не PCL) принтеров.
Делай что должно, и будь что будет
Re: Как отследить количество страниц отправленых на печать?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 28.03.03 12:36
Оценка: 6 (1)
Здравствуйте, tas, Вы писали:

Я делал так (на Delphi, но идея понятна --- использование FindFirstPrinterChangeNotification, WaitForSingleObject, ...):

procedure TPrintNotificationThread.Execute;
var
  Handle: THandle;
  Change: Cardinal;
  NotifyData: Pointer;
const
  JobFields: array[0..8] of Word =
  (
    JOB_NOTIFY_FIELD_STATUS,
    JOB_NOTIFY_FIELD_STATUS_STRING,
    JOB_NOTIFY_FIELD_DOCUMENT,
    JOB_NOTIFY_FIELD_USER_NAME,
    JOB_NOTIFY_FIELD_TOTAL_PAGES,
    JOB_NOTIFY_FIELD_PAGES_PRINTED,
    JOB_NOTIFY_FIELD_SUBMITTED,
    JOB_NOTIFY_FIELD_BYTES_PRINTED,
    JOB_NOTIFY_FIELD_TOTAL_BYTES
  );
  Notification: TPrinterNotifyOptionsType = (
    wType: JOB_NOTIFY_TYPE;
    Reserved0: 0;
    Reserved1: 0;
    Reserved2: 0;
    Count: High(JobFields) - Low(JobFields) + 1;
    pFields: @JobFields;
  );
  NotificationOptions: TPrinterNotifyOptions = (
    Version: 2;
    Flags: PRINTER_NOTIFY_OPTIONS_REFRESH;
    Count: 1;
    pTypes: @Notification;
  );
begin
  Handle := FindFirstPrinterChangeNotification(
    Printer,
    PRINTER_CHANGE_JOB,
    0,
    @NotificationOptions);
  if (Handle = INVALID_HANDLE_VALUE) then
  begin
    ShowMessage(IntToStr(GetLastError()));
    Exit;
  end;
  repeat
    if WaitForSingleObject(Handle, 1000) = WAIT_OBJECT_0 then
    begin
      FindNextPrinterChangeNotification(Handle, Change, nil, NotifyData);
      PostMessage(Wnd, PM_PRINT_NOTIFY, Change, Integer(NotifyData)); // Мое сообщение
    end;
  until Terminated;
  FindClosePrinterChangeNotification(Handle)
end;


Только количество страниц, посланное на печать в самом начале постоянно растет от 0 до посланного числа страниц.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.