Newsgroup: it.comp.lang.visual-basic
Titolo: Stato stampante

Ciao a tutti.
Il mio problema è riuscire a capire in che stato si trova la stampante PRIMA
di mandare qualcosa in stampa.
Ho provato con la funzione API GetPrinter, ottenendo il risultato in una
struttura PRINTER_INFO_2, ma lo status è sempre ZERO, cioè READY, anche se
la stampante è spenta.
Qualcuno sa consigliarmi qualche trucco meno orripilante del mostrare
all'utente una msgbox con: "ACCERTARSI CHE LA STAMPANTE SIA ACCESA E ONLINE
E LA CARTA SIA CARICATA"
(devo stampare su moduli numerati e prefincati che non possono essere
sbagliati!)

 wrote in message
news:8sjiqm$on0$1...@fe1.cs.interbusiness.it...

A meno che ultimamente non siano uscite delle stampanti che comunicano anche
spente o facciano qualcosa d' altro oltre che stampare, credo che non sia
proprio possibile intercettare lo stato di spento della stampante prima di
mandare qualcosa in stampa.
Non parliamo poi della quantita' di carta presente nel vassoio !
Forse se la stampante fosse collegata direttamente alla porta parallela del
pc si potrebbe tentare qualche trucco lavorando direttamente sulla porta, ma
non so se cmq funzionerebbe con WinNT.
Ancora peggio se la stampante e' in rete.
D' altronde, pensiamo di stampare un documento con Word con la stampante
senza carta: che succede ? Avvia la stampa, salvo poi restituire un
messaggio di errore.
In ogni caso, se la stampante e' spenta o e' senza carta non e' un problema
del nostro programma (tanto mica riusciremmo ad accenderla o a caricaricare
la carta !) ma dell' utente. Sicche', dargli un avviso PRIMA di lanciare la
stampa o DOPO aver tentato di farlo, che DIFFERENZA fa ?

 di mandare qualcosa in stampa.
Un messaggio che ho postato tempo fa. Vedi se aiuta.
===============================================
Lo status della stampante, in Windows, viene reso come
informazione relativa ai singoli Job in corso per printer driver.
Normalmente lo stato della stampante è "Ready" anche se non
è accesa (questo dipende comunque anche dal driver).
Per ottenere informazioni sui job di una stampante, occorre
ottenere l'handle della stampante. La funzione da usare è
OpenPrinter. Ti faccio un esempio su come ottenere informazioni
relative alla stampante predefinita:
Dim PrinterName As String
Dim arrayBuf() As Long
Dim lngNeeded As Long
Dim lngNumitems As Long
Dim lngRet As Long
Dim hPrinter as Long
Dim jobinfo As JOB_INFO_2
Dim lngStructLenght As Long
Dim Counter As Long
   'Determina lo spazio necessario per le informazioni sulla stampante
   lngRet = EnumPrinters(PRINTER_ENUM_DEFAULT, _
        "", 1, ByVal 0, 0, lngNeeded, lngNumitems)
   'La funzione ritorna le informazioni in byte. Occorre però
   'trasformare i byte in long. Quello che serve ottenere sono
   'i valori effettivi e i puntatori alle stringhe o alle sotto-strutture
   ReDim arrayBuf(0 To lngNeeded / 4 - 1)
   'Ottiene le informazioni sulla stampante predefinita
   lngRet = EnumPrinters(PRINTER_ENUM_DEFAULT, _
        "", 1, arrayBuf(0), lngNeeded, lngNeeded, lngNumitems)
   'Copia il nome della stampante. E' necessario usare le
   'funzioni lstrlen e lstrcpy perché stiamo trattando puntatori.
   'Il nome della stampante è dato dal puntatore inserito nel terzo
   'elemento della struttura
   PrinterName = Space(lstrlen(arrayBuf(2)))
   lngRet = lstrcpy(PrinterName, arrayBuf(2))
   'Otteniamo l'handle della stampante
   lngRet = OpenPrinter(PrinterName, hPrinter, ByVal 0&)
   'Si determina lo spazio necessario per le informazioni richeste
   lngRet = EnumJobs(hPrinter, 0, 100, 2, ByVal 0&, 0&, lngNeeded, lngNumitems)
   If lngNumitems > 0 Then
     'Se ci sono Job attivi procediamo
   Else
     'Non ci sono Job attivi - fine procedura
     'Rilascia l'handle della stampante
     lngRet = ClosePrinter(hPrinter)
     'Exit Function o quant'altro
   End If
   'Come in precedenza, uso un array di long, mentre la
   'funzione ritorna valori in byte.
   ReDim arrayBuf(0 To lngNeeded / 4 - 1)
   'Ottiene le informazioni sui job correnti
   lngRet = EnumJobs(hPrinter, 0, 100, 2, arrayBuf(0), lngNeeded, lngNeeded, lngNumitems)
   'Dimensioni in long
   lngStructLenght = Len(jobinfo) / 4
   'Cicla in base al numero di Job rilevati
   For Counter = 0 To lngNumitems - 1
      'Il primo elemento dell'array è l'ID (long) del Job
      jobinfo.JobId = arrayBuf(lngStructLenght * Counter)
      'Il 4° elemento è il puntatore al nome dell'utente
      jobinfo.pUserName = Space(lstrlen_
            (arrayBuf(lngStructLenght * Counter + 3)))
      lngRet = lstrcpy(jobinfo.pUserName, _
            arrayBuf(lngStructLenght * Counter + 3))
      'Il 12° elemento è lo status del Job corrente
   -> jobinfo.pStatus = arrayBuf(lngStructLenght * Counter + 11)
      'Il 19° elemento è il numero di pagine
      jobinfo.TotalPages = arrayBuf(lngStructLenght * Counter + 18)
      'il 21° elemento è il puntatore alla struttura SYSTEMTIME
      'CopyMemory è la funzione RtlMoveMemory rinominata (si usa)
      CopyMemory jobinfo.Submitted, arrayBuf(_
            lngStructLenght * Counter + 20), _
            Len(jobinfo.Submitted)
   Next Counter
   'Rilascia l'handle della stampante
   lngRet = ClosePrinter(hPrinter)
Per ottenere informazioni sullo stato della stampante
occorre mettere in AND jobinfo.pStatus con uno dei
possibili valori si stato:
Public Const PRINTER_STATUS_BUSY = &H200
Public Const PRINTER_STATUS_DOOR_OPEN = &H400000
Public Const PRINTER_STATUS_ERROR = &H2
Public Const PRINTER_STATUS_INITIALIZING = &H8000
Public Const PRINTER_STATUS_IO_ACTIVE = &H100
Public Const PRINTER_STATUS_MANUAL_FEED = &H20
Public Const PRINTER_STATUS_NO_TONER = &H40000
Public Const PRINTER_STATUS_NOT_AVAILABLE = &H1000
Public Const PRINTER_STATUS_OFFLINE = &H80
Public Const PRINTER_STATUS_OUT_OF_MEMORY = &H200000
Public Const PRINTER_STATUS_OUTPUT_BIN_FULL = &H800
Public Const PRINTER_STATUS_PAGE_PUNT = &H80000
Public Const PRINTER_STATUS_PAPER_JAM = &H8
Public Const PRINTER_STATUS_PAPER_OUT = &H10
Public Const PRINTER_STATUS_PAPER_PROBLEM = &H40
Public Const PRINTER_STATUS_PAUSED = &H1
Public Const PRINTER_STATUS_PENDING_DELETION = &H4
Public Const PRINTER_STATUS_PRINTING = &H400
Public Const PRINTER_STATUS_PROCESSING = &H4000
Public Const PRINTER_STATUS_TONER_LOW = &H20000
Public Const PRINTER_STATUS_USER_INTERVENTION = &H100000
Public Const PRINTER_STATUS_WAITING = &H2000
Public Const PRINTER_STATUS_WARMING_UP = &H10000
===============================================

Grazie, Jimi, la tua spiegazione è ottima, ma prevede che ci siano già dei
job in coda sulla stampante, che non è il mio caso!
Premetto che il mio programma dovrà SEMPRE stampare su una stampante ad aghi
(stampa in duplice copia) collegata direttamente al PC sulla LPT1: e che i
PC avranno al 90% WinNT workstation come S.O.
Quindi non posso mandare schifezze in stampa per verificare lo stato della
stampante, perchè i moduli sono numerati e non "cestinabili"!
......oddio, se si inceppa la stampante è un conto, ma se è il programma che
inizia a stampare a caso è un'altro!
Se c'è qualche altro suggerimento .........
Grazie a tutti!!

> Se c'è qualche altro suggerimento .........
Verifica se la stampante supporta la comunicazione bidirezionale.
Se è attiva (o attivabile) si possono trovare altre soluzioni.

 ha scritto nel messaggio
news:8sm9ag$l1vq2$1...@ID-51240.news.cis.dfn.de...


 supporta la comunicazione bidirezionale!
E' il driver che conta.
Verifica in lo spooler della stampante.
Stampante xyz
    --> Proprietà
        --> Dettagli
            --> Imposta spooler
                --> Imposta supporto bidirezionale...
Sempre che tu abbia Win9x
Se è attivabile o attivo...

 wrote in message
8slb9l$kp80e$1...@ID-56381.news.cis.dfn.de...
