Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Принтер, как отловить начало печати 
:(
    Опции темы
tigger
Дата 11.3.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: нет
Всего: 4



Суть проблемы в следующем:

необходимо создать программу которая сидит в трее и ждет когда же заработает принтер.
Когда он заработает нужно узнать сколько страниц будет печататься, кто знает помогите?


--------------------
user posted image
PM MAIL   Вверх
MIX55
Дата 12.3.2006, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


много работы
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 208
Регистрация: 23.10.2005
Где: Здесь

Репутация: 3
Всего: 4



вот попробуй код:

Код

private
 procedure WM_SpoolerStatus(var Msg:TWMSPOOLERSTATUS);message WM_SPOOLERSTATUS;
.......
......
......
implementation

procedure TForm1.WM_SpoolerStatus(var Msg:TWMSPOOLERSTATUS);
begin
 label1.Caption:=IntToStr(Msg.JobsLeft)+'тра-та-та';
 Msg.Result:=0
end;

--------------------
Hарод, а как в дельфи писать паскалевские проги....?*********************************************Жизнь слишком коротка, чтобы писать на Assembler'e
PM MAIL ICQ   Вверх
tigger
Дата 13.3.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: нет
Всего: 4



MIX55, не работает!!!


--------------------
user posted image
PM MAIL   Вверх
Marlin
Дата 14.3.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 20.2.2006

Репутация: нет
Всего: 1



вот статейка небольшая

В Windows существуют встроенные средства для мониторинга заданий на принтере. Однако, давайте разберёмся, как отслеживать задания на принтере программно. Для существует API функция "EnumJobs", которая позволяет получить давольно много информации о текущем состоянии принтера (Имя задания, Состояние, дату, время и т.д.).

Ниже представлена функция, которая использует EnumJobs и возвращает массив структуры, в котором представлена вся необходимая информация:

Код
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; 

Пример использования: 

Создайте новый проект со StringGrid и Timer. 
В StringGrid установите свойства "ColCount" и "RowCount" в 20. 
У таймера (Timer) установите свойство "Interval" в 500. 
В обработчик события "OnTime" таймера добавьте следующий код: 

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; 


Добавлено @ 12:51
пример который предложил MIX55 должен работать, попробуй отловить это сообщение в WndProc
--------------------
Программист решает проблемы, о которых пользователь даже не задумывается,способами, о котороых он даже не подозревает.
PM MAIL   Вверх
tigger
Дата 14.3.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: нет
Всего: 4



Чего-то ничего не получается выложите рабочий пример...
smile


--------------------
user posted image
PM MAIL   Вверх
Cashey
Дата 25.4.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Цитата(tigger @  13.3.2006,  14:44 Найти цитируемый пост)
MIX55, не работает!!! 

и здесь тоже повторюсь
Цитата

WM_SPOOLERSTATUS отсутствует во всех операционных системах с ядром NT (в том числе в 2000 и XP). Вместо обработки этого сообщения следует использовать функции FindFirstPrinterChangeNotification и FindNextPrinterChangeNotification



--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0469 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.