Можно ли управлять принтером HP?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Tim_111
Новичок
Сообщения: 5
Зарегистрирован: 03 Май 2011, 16:39
Откуда: Брянск
Контактная информация:

Можно ли управлять принтером HP?

Сообщение Tim_111 »

Ну или не HP, а любым доступным в Винде принтером. Хочется уметь переводить его в оффлайн. Еще хочется уметь из программы узнавать, завершил ли принтер задание.

Суть хотелки такова. Есть софтина, которой управляет важная тетка. Софтина рассылает на несколько принтеров пачки бумажек, которых дофига. В одной пачке 50, в другой - тыща или две. Возле принтеров бегают тетки попроще и вынимают бумагу из выходного лотка. Ежли кончилась бумага во входном - на принтере мигает красная лампочка и на дисплее пишет "Всунь бумагу". А вот когда задание отпечатано, принтер просто остается в онлайне, горит зеленая лампочка. И тетки возле принтера толком не знают, чего он остановился - то ли завершил, то ли просто очередная порция данных в него еще не пролезла. Приходится смотреть последний лист. И если завершил - орать важной управляющей тетке, чтоб она на этот принтер следующее задание отправила :)

Так вот. Пять лет все устраивало, но ситуация изменилась. Тетки у принтеров охрипли, а тетка у компа оглохла :). Надо изобрести механизм управления. Я им посоветовал стучать гаечным ключом по грибкам вытяжки, слышно, но звук одинаковый, непонятно, с какого принтера сигнал :). Вот если б в конце задания на печать суметь подпихнуть команду, которая переведет принтер в оффлайн, тетке за компом и знать не надо, закончил он там печать или нет. Отправила задание в спул, оно провалилось, следом еще одно... Да ее ваще тогда выгнать можно (кому она теперь нужна глухая-то?) и задания распределять программно, тетка у принтера увидит, что зеленая лампа потухла, принтер в оффлайне, значит, задание надо забрать из лотка, после чего нажать зеленую кнопку, он переключится в онлайн и начнет следующее задание печатать.

В принципе можно было б и статус принтера читать. Но именно принтера, а не спула. В спул-то задание за полминуты проваливается, а вот когда он физически завершит печать - ХЗ.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8031
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Можно ли управлять принтером HP?

Сообщение Игорь Столяров »

Как-то много лишнего, замыливается суть вопроса ... :(

А определить состояние принтера не сложно.
Набери в Yandex что-то вроде "API состояния принтера"
Откроется, например: http://www.codenet.ru/progr/vbasic/printer.php и т.д.
Make Clarion Great Again ! 😎
Tim_111
Новичок
Сообщения: 5
Зарегистрирован: 03 Май 2011, 16:39
Откуда: Брянск
Контактная информация:

Можно ли управлять принтером HP?

Сообщение Tim_111 »

Много - чтоб пояснить суть процесса. Возможно, то же самое можно реализовать и другими способами (может, вообще есть готовая софтина для этих целей)
За ссылку спасибо, сейчас еще погуглю по поводу SetPrinter, может, оно поможет
Ал
✯ Ветеран ✯
Сообщения: 1038
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия
Поблагодарили: 1 раз

Можно ли управлять принтером HP?

Сообщение Ал »

Тетки у принтеров охрипли
Ну если ещё не ослепли - напечатай им "Готово" или "Хватит орать" после печати последнего листа отчёта.
:)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Можно ли управлять принтером HP?

Сообщение Дед Пахом »

Ал писал(а): Ну если ещё не ослепли - напечатай им "Готово" или "Хватит орать" после печати последнего листа отчёта.
Зачёт!
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Можно ли управлять принтером HP?

Сообщение Admin »

Есть еще предложение. Не знаю можно реализовать или нет.
Если двухлоточный принтер. Печатаем задание из лотка 1 с белой бумагой. Печатаем пустую страницу из лотка с цветной бумагой.
Задания спуливаем подряд. Все разделено цветными бумажками.
Профит.

P.S. Цветные бумажки -> обратно в принтер.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Можно ли управлять принтером HP?

Сообщение Shur »

Шутки шутками, а мы, когда N лет назад печатали накладные на принтерах HP, почти так и делали -- чистые разделительные листы (потом, правда, их никто назад в принтер не вставлял из опасений застревания такой бумаги в принтере). Вокруг принтеров никто не бегал -- ждали, пока соберётся большая стопка, потом её забирали и разбирали на столах, попутно ставя печати и подписи.

А вот чтобы организовать равномерную загрузку принтеров пока недостаточно информации (какого рода задания печатаются, из какой программы, есть ли возможность что-либо впечатывать в лист, есть ли возможность определить примерный объём задания и пр.)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8031
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 96 раз

Можно ли управлять принтером HP?

Сообщение Игорь Столяров »

Вот, набросал за полчасика. :) Точнее перевел c басика. ;)
Опрос статуса принтера (именно принтера).

Код: Выделить всё

! --- Вызов

  Map
     GetMyStatusPrinter(*cstring,*byte,*cstring)
  end
  
  ! Ставим в окне опрос текущего принтера по таймеру раз в секунду   

  Loc:PrinterName = Printer{PropPrint:Device}
  GetMyStatusPrinter(Loc:PrinterName,Loc:Status,Loc:NameStatus)
  Message(Loc:Status & '|' & Loc:NameStatus) ! По Loc:Status красим сообщение, выводим картинки и т.д. - по вкусу
  
! --- Процедура

GetMyStatusPrinter   PROCEDURE  (xName_,xStatus_,xNameSt_)

  Map
    Module('Windows')

    WinOpenPrinter     (*CSTRING pPrinterName,       | printer or server name
                        *LONG phPrinter,             | printer or server handle
                        LONG pDefault                | printer defaults
                       ),BOOL,PASCAL,RAW,NAME('OpenPrinterA')

    WinGetPrinter      (LONG hPrinter,               | handle to printer
                        LONG Level,                  | information level
                        *? pPrinter,                 | printer information buffer
                        LONG cbBuf,                  | size of buffer
                        *LONG pcbNeeded              | bytes received or required
                       ),BOOL,PASCAL,RAW,NAME('GetPrinterA')

    WinClosePrinter    ( LONG hPrinter ),BOOL,RAW,PASCAL,PROC,Name('ClosePrinter')
  end
 end

Loc:Buffer     Group
PrnStatus        Long
                   end

Loc:hPrinter   Long
Loc:Size         Long

PRINTER_STATUS_READY             EQUATE(      0h)
PRINTER_STATUS_PAUSED            EQUATE(      1h)
PRINTER_STATUS_ERROR             EQUATE(      2h)
PRINTER_STATUS_PENDING_DELETION  EQUATE(      4h)
PRINTER_STATUS_PAPER_JAM         EQUATE(      8h)
PRINTER_STATUS_PAPER_OUT         EQUATE(     10h)
PRINTER_STATUS_MANUAL_FEED       EQUATE(     20h)
PRINTER_STATUS_PAPER_PROBLEM     EQUATE(     40h)
PRINTER_STATUS_OFFLINE           EQUATE(     80h)
PRINTER_STATUS_IO_ACTIVE         EQUATE(    100h)
PRINTER_STATUS_BUSY              EQUATE(    200h)
PRINTER_STATUS_PRINTING          EQUATE(    400h)
PRINTER_STATUS_OUTPUT_BIN_FULL   EQUATE(    800h)
PRINTER_STATUS_NOT_AVAILABLE     EQUATE(   1000h)
PRINTER_STATUS_WAITING           EQUATE(   2000h)
PRINTER_STATUS_PROCESSING        EQUATE(   4000h)
PRINTER_STATUS_INITIALIZING      EQUATE(   8000h)
PRINTER_STATUS_WARMING_UP        EQUATE(  10000h)
PRINTER_STATUS_TONER_LOW         EQUATE(  20000h)
PRINTER_STATUS_NO_TONER          EQUATE(  40000h)
PRINTER_STATUS_PAGE_PUNT         EQUATE(  80000h)
PRINTER_STATUS_USER_INTERVENTION EQUATE( 100000h)
PRINTER_STATUS_OUT_OF_MEMORY     EQUATE( 200000h)
PRINTER_STATUS_DOOR_OPEN         EQUATE( 400000h)
PRINTER_STATUS_SERVER_UNKNOWN    EQUATE( 800000h)
PRINTER_STATUS_POWER_SAVE        EQUATE(1000000h)

  CODE
  
  xStatus_ = 0        ! Unknow status printer
  xNameSt_ = '???'   ! ХЗ состояние

  If WinOpenPrinter(xName_,Loc:hPrinter,0)
     If WinGetPrinter(Loc:hPrinter,6,Loc:Buffer,Size(Loc:Buffer),Loc:Size)

        Case Loc:Buffer.PrnStatus
        Of PRINTER_STATUS_READY
           xStatus_ = 1
           xNameSt_ = 'Готов'
        Of PRINTER_STATUS_PAUSED
           xStatus_ = 2
           xNameSt_ = 'Приостановлен'
        Of PRINTER_STATUS_ERROR
           xStatus_ = 2
           xNameSt_ = 'Ошибка'
        Of PRINTER_STATUS_PENDING_DELETION
           xStatus_ = 2
           xNameSt_ = 'Состояние ожидания удаления'
        Of PRINTER_STATUS_PAPER_JAM
           xStatus_ = 2
           xNameSt_ = 'Замята бумага'
        Of PRINTER_STATUS_PAPER_OUT
           xStatus_ = 2
           xNameSt_ = 'Нет бумаги'
        Of PRINTER_STATUS_MANUAL_FEED
           xStatus_ = 1
           xNameSt_ = 'Включена ручная подача бумаги'
        Of PRINTER_STATUS_PAPER_PROBLEM
           xStatus_ = 2
           xNameSt_ = 'Проблема с бумагой'
        Of PRINTER_STATUS_OFFLINE
           xStatus_ = 2
           xNameSt_ = 'Отключен'
        Of PRINTER_STATUS_IO_ACTIVE
           xStatus_ = 1
           xNameSt_ = 'Идет обмен данными'
        Of PRINTER_STATUS_BUSY
           xStatus_ = 2
           xNameSt_ = 'Занят'
        Of PRINTER_STATUS_PRINTING
           xStatus_ = 1
           xNameSt_ = 'Печатает'
        Of PRINTER_STATUS_OUTPUT_BIN_FULL
           xStatus_ = 2
           xNameSt_ = 'Заполнен выходной лоток'
        Of PRINTER_STATUS_NOT_AVAILABLE
           xStatus_ = 2
           xNameSt_ = 'Не доступен для печати'
        Of PRINTER_STATUS_WAITING
           xStatus_ = 2
           xNameSt_ = 'В ожидании'
        Of PRINTER_STATUS_PROCESSING
           xStatus_ = 1
           xNameSt_ = 'Обработка команды'
        Of PRINTER_STATUS_INITIALIZING
           xStatus_ = 2
           xNameSt_ = 'Инициализация ...'
        Of PRINTER_STATUS_WARMING_UP
           xStatus_ = 2
           xNameSt_ = 'Прогревается ...'
        Of PRINTER_STATUS_TONER_LOW
           xStatus_ = 1
           xNameSt_ = 'Мало тонера'
        Of PRINTER_STATUS_NO_TONER
           xStatus_ = 2
           xNameSt_ = 'Закончился тонер'
        Of PRINTER_STATUS_PAGE_PUNT
           xStatus_ = 2
           xNameSt_ = 'Не может напечатать текущую страницу'
        Of PRINTER_STATUS_USER_INTERVENTION
           xStatus_ = 2
           xNameSt_ = 'Ошибка, требующая вмешательства пользователя'
        Of PRINTER_STATUS_OUT_OF_MEMORY
           xStatus_ = 2
           xNameSt_ = 'Закончилась память'
        Of PRINTER_STATUS_DOOR_OPEN
           xStatus_ = 2
           xNameSt_ = 'Открыта дверка принтера'
        Of PRINTER_STATUS_SERVER_UNKNOWN
           xStatus_ = 0
           xNameSt_ = 'Состояние неизвестно'
        Of PRINTER_STATUS_POWER_SAVE
           xStatus_ = 1
           xNameSt_ = 'Находится в состоянии экономии энергии'
        end
     end

     If WinClosePrinter(Loc:hPrinter).
  end  
  
Make Clarion Great Again ! 😎
Ответить