Newsgroup: it.comp.lang.visual-basic
Titolo: con API?

Ho bisogno di conoscere lo stato della stampante (se un job è in corso
ecc. )
Qaulcuno sa dirmi quale funzione posso usare, o se è il caso di ricorrere a
qualche api?
Attenzione la stampante non viene gestita con l'oggetto Printer ma con delle
funzioni di winspool come OpenPrinter, StartDocPrinter, WritePrinter, ecc...
perchè in questo modo riesco a far funzionare la stampante ad aghi in
modalità TESTO e non grafica. Il problema è che non riesco a trovare un
sistema per monitorare lo stato.
Sono grato a chiunque mi risponderà.
Grazie Walter

 qualche api?
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