Autor
|
Tema: estado de impresora (Leído 5,544 veces)
|
Moetor
Desconectado
Mensajes: 2
|
Saludos quisiera saber como puedo detectar el estado de una impersora de forma automatica, es decir que la aplicacion este en ejecucion y al momento de mandar a imprimir, la aplicacion automaticamente escriba en un fichero el numero de impresiones. Espero alguien me ayude
|
|
|
En línea
|
|
|
|
Angellore
Desconectado
Mensajes: 13
|
Hola. Escribí un código que te da información de la impresora especificada, y entre esa información el número de trabajos que tiene en cola. El código siguiente debe ir en un módulo estándar: Option Explicit
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
Const ERROR_INSUFFICIENT_BUFFER = 122
Const MEM_COMMIT = &H1000& Const PAGE_READWRITE = 4 Const MEM_RELEASE = &H8000
Const CCHDEVICENAME = 32 Const CCHFORMNAME = 32
Private Type DEVMODE dmDeviceName(1 To CCHDEVICENAME) As Byte dmSpecVersion As Integer dmDriverVersion As Integer dmSize As Integer dmDriverExtra As Integer dmFields As Long dmOrientation As Integer dmPaperSize As Integer dmPaperLength As Integer dmPaperWidth As Integer dmScale As Integer dmCopies As Integer dmDefaultSource As Integer dmPrintQuality As Integer dmColor As Integer dmDuplex As Integer dmYResolution As Integer dmTTOption As Integer dmCollate As Integer dmFormName(1 To CCHFORMNAME) As Byte dmUnusedPadding As Integer dmBitsPerPel As Long dmPelsWidth As Long dmPelsHeight As Long dmDisplayFlags As Long dmDisplayFrequency As Long End Type
Private Type ACL AclRevision As Byte Sbz1 As Byte AclSize As Integer AceCount As Integer Sbz2 As Integer End Type
Private Type SECURITY_DESCRIPTOR Revision As Byte Sbz1 As Byte Control As Long Owner As Long Group As Long Sacl As ACL Dacl As ACL End Type
Private Type PRINTER_INFO_2 pServerName As Long ' lpstr pPrinterName As Long ' lpstr pShareName As Long ' lpstr pPortName As Long ' lpstr pDriverName As Long ' lpstr pComment As Long ' lpstr pLocation As Long ' lpstr pDevMode As DEVMODE pSepFile As Long ' lpstr pPrintProcessor As Long ' lpstr pDatatype As Long ' lpstr pParameters As Long ' lpstr pSecurityDescriptor As SECURITY_DESCRIPTOR Attributes As Long Priority As Long DefaultPriority As Long StartTime As Long UntilTime As Long Status As Long cJobs As Long AveragePPM As Long End Type
Type PrinterInfo ServerName As String ' Nombre del servidor donde se encuentra (si es local sería localhost). PrinterName As String ' Nombre de la impresora. ShareName As String ' Nombre del recurso compartido. PortName As String ' Nombre del puerto (LPT1, LPT2, etc) DriverName As String ' Nombre del controlador de impresora. Comment As String ' Comentarios. Location As String ' Ubicación. PrintProcessor As String ' Nombre del procesador de la impresora. Status As Long ' Estado de la impresora. Jobs As Long ' Cantidad de trabajos en la cola. AveragePPM As Long ' Páginas por minuto que imprime. End Type
Public Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, ByVal pDefault As Long) As Long Public Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As Long, pcbNeeded As Long) As Long Public Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Public Declare Function VirtualAlloc Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long Public Declare Function VirtualFree Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, Optional lpNumberOfBytesWritten As Long) As Long Public Declare Function lstrlenptr Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Public Declare Function GetCurrentProcess Lib "kernel32" () As Long
Function GetPrinterInfo(ByVal DeviceName As String) As PrinterInfo Dim lpPrinterInfo As PRINTER_INFO_2 Dim lBytesNeeded&, hPrinter& Dim hMem&, r&
' Abre la impresora y devuelve un controlador de impresora (hPrinter). ' r = OpenPrinter(DeviceName, hPrinter, 0&)
If r = 0 Then Debug.Print "No se pudo abrir la impresora especificada" Exit Function End If ' Primero obtiene el tamaño de los datos para ' la impresora especificada. ' r = GetPrinter(hPrinter, 2, 0&, 0&, lBytesNeeded) If Err.LastDllError = ERROR_INSUFFICIENT_BUFFER Then ' Asigna memoria para utilizarla como buffer en ' la llamada a la función GetPrinter. ' hMem = VirtualAlloc(0&, lBytesNeeded, MEM_COMMIT, PAGE_READWRITE) ' Ahora sí obtiene la información de la impresora especificada. ' r = GetPrinter(hPrinter, 2, ByVal hMem, lBytesNeeded, lBytesNeeded) If r = 0 Then GoTo GetInfoFail ' Copia los datos a la variable lpPrinterInfo. ' r = ReadProcessMemory(GetCurrentProcess, hMem, lpPrinterInfo, LenB(lpPrinterInfo)) r = VirtualFree(hMem, 0&, MEM_RELEASE) ' Libera la memoria. Else GetInfoFail: Debug.Print "No se puede obtener información de la impresora." GoTo PrinterFault End If With GetPrinterInfo .AveragePPM = lpPrinterInfo.AveragePPM .Comment = PtrToStrA(lpPrinterInfo.pComment) .DriverName = PtrToStrA(lpPrinterInfo.pDriverName) .Jobs = lpPrinterInfo.cJobs .Location = PtrToStrA(lpPrinterInfo.pLocation) .PortName = PtrToStrA(lpPrinterInfo.pPortName) .PrinterName = PtrToStrA(lpPrinterInfo.pPrinterName) .PrintProcessor = PtrToStrA(lpPrinterInfo.pPrintProcessor) .ServerName = PtrToStrA(lpPrinterInfo.pServerName) .ShareName = PtrToStrA(lpPrinterInfo.pShareName) .Status = lpPrinterInfo.Status End With PrinterFault: ' Cierra la impresora. ' r = ClosePrinter(hPrinter)
End Function
Function PtrToStrA(ByVal lpAnsiStr As Long) As String ' Esta función convierte un puntero de cadena ANSI ' en una variable String. ' Dim sData$ Dim lLen&
lLen = lstrlenptr(lpAnsiStr) sData = String$(lLen, 0) If ReadProcessMemory(GetCurrentProcess(), lpAnsiStr, ByVal sData, lLen) Then PtrToStrA = sData End If End Function
La función GetPrinterInfo sólo necesita un argumento y es el nombre del dispositivo de impresión al que se desea consultar. Para obtener una lista de las impresoras VB proporciona la colección Printers, que se puede recorrer con un bucle For Each...Next Por ejemplo: Sub EnumPrinterInfo() Dim lpInfo As PrinterInfo Dim csPrinter
For Each csPrinter In Printers lpInfo = GetPrinterInfo(csPrinter.DeviceName) Debug.Print "La impresora " & lpInfo.PrinterName & " tiene " _ & lpInfo.Jobs & " trabajos en cola."
Next End Sub
Saludos. Angellore.
|
|
|
En línea
|
|
|
|
Moetor
Desconectado
Mensajes: 2
|
gracias muchas gracias Angellore con esto podre empezar
|
|
|
En línea
|
|
|
|
@elmer
Desconectado
Mensajes: 1
|
habra alguna manera de migrar este codigo fuente a vb.net no logro conseguirlo y quien mejor que el autor si fuera posible Hola. Escribí un código que te da información de la impresora especificada, y entre esa información el número de trabajos que tiene en cola. El código siguiente debe ir en un módulo estándar: Option Explicit
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
Const ERROR_INSUFFICIENT_BUFFER = 122
Const MEM_COMMIT = &H1000& Const PAGE_READWRITE = 4 Const MEM_RELEASE = &H8000
Const CCHDEVICENAME = 32 Const CCHFORMNAME = 32
Private Type DEVMODE dmDeviceName(1 To CCHDEVICENAME) As Byte dmSpecVersion As Integer dmDriverVersion As Integer dmSize As Integer dmDriverExtra As Integer dmFields As Long dmOrientation As Integer dmPaperSize As Integer dmPaperLength As Integer dmPaperWidth As Integer dmScale As Integer dmCopies As Integer dmDefaultSource As Integer dmPrintQuality As Integer dmColor As Integer dmDuplex As Integer dmYResolution As Integer dmTTOption As Integer dmCollate As Integer dmFormName(1 To CCHFORMNAME) As Byte dmUnusedPadding As Integer dmBitsPerPel As Long dmPelsWidth As Long dmPelsHeight As Long dmDisplayFlags As Long dmDisplayFrequency As Long End Type
Private Type ACL AclRevision As Byte Sbz1 As Byte AclSize As Integer AceCount As Integer Sbz2 As Integer End Type
Private Type SECURITY_DESCRIPTOR Revision As Byte Sbz1 As Byte Control As Long Owner As Long Group As Long Sacl As ACL Dacl As ACL End Type
Private Type PRINTER_INFO_2 pServerName As Long ' lpstr pPrinterName As Long ' lpstr pShareName As Long ' lpstr pPortName As Long ' lpstr pDriverName As Long ' lpstr pComment As Long ' lpstr pLocation As Long ' lpstr pDevMode As DEVMODE pSepFile As Long ' lpstr pPrintProcessor As Long ' lpstr pDatatype As Long ' lpstr pParameters As Long ' lpstr pSecurityDescriptor As SECURITY_DESCRIPTOR Attributes As Long Priority As Long DefaultPriority As Long StartTime As Long UntilTime As Long Status As Long cJobs As Long AveragePPM As Long End Type
Type PrinterInfo ServerName As String ' Nombre del servidor donde se encuentra (si es local sería localhost). PrinterName As String ' Nombre de la impresora. ShareName As String ' Nombre del recurso compartido. PortName As String ' Nombre del puerto (LPT1, LPT2, etc) DriverName As String ' Nombre del controlador de impresora. Comment As String ' Comentarios. Location As String ' Ubicación. PrintProcessor As String ' Nombre del procesador de la impresora. Status As Long ' Estado de la impresora. Jobs As Long ' Cantidad de trabajos en la cola. AveragePPM As Long ' Páginas por minuto que imprime. End Type
Public Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, ByVal pDefault As Long) As Long Public Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As Long, pcbNeeded As Long) As Long Public Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Public Declare Function VirtualAlloc Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long Public Declare Function VirtualFree Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, Optional lpNumberOfBytesWritten As Long) As Long Public Declare Function lstrlenptr Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Public Declare Function GetCurrentProcess Lib "kernel32" () As Long
Function GetPrinterInfo(ByVal DeviceName As String) As PrinterInfo Dim lpPrinterInfo As PRINTER_INFO_2 Dim lBytesNeeded&, hPrinter& Dim hMem&, r&
' Abre la impresora y devuelve un controlador de impresora (hPrinter). ' r = OpenPrinter(DeviceName, hPrinter, 0&)
If r = 0 Then Debug.Print "No se pudo abrir la impresora especificada" Exit Function End If ' Primero obtiene el tamaño de los datos para ' la impresora especificada. ' r = GetPrinter(hPrinter, 2, 0&, 0&, lBytesNeeded) If Err.LastDllError = ERROR_INSUFFICIENT_BUFFER Then ' Asigna memoria para utilizarla como buffer en ' la llamada a la función GetPrinter. ' hMem = VirtualAlloc(0&, lBytesNeeded, MEM_COMMIT, PAGE_READWRITE) ' Ahora sí obtiene la información de la impresora especificada. ' r = GetPrinter(hPrinter, 2, ByVal hMem, lBytesNeeded, lBytesNeeded) If r = 0 Then GoTo GetInfoFail ' Copia los datos a la variable lpPrinterInfo. ' r = ReadProcessMemory(GetCurrentProcess, hMem, lpPrinterInfo, LenB(lpPrinterInfo)) r = VirtualFree(hMem, 0&, MEM_RELEASE) ' Libera la memoria. Else GetInfoFail: Debug.Print "No se puede obtener información de la impresora." GoTo PrinterFault End If With GetPrinterInfo .AveragePPM = lpPrinterInfo.AveragePPM .Comment = PtrToStrA(lpPrinterInfo.pComment) .DriverName = PtrToStrA(lpPrinterInfo.pDriverName) .Jobs = lpPrinterInfo.cJobs .Location = PtrToStrA(lpPrinterInfo.pLocation) .PortName = PtrToStrA(lpPrinterInfo.pPortName) .PrinterName = PtrToStrA(lpPrinterInfo.pPrinterName) .PrintProcessor = PtrToStrA(lpPrinterInfo.pPrintProcessor) .ServerName = PtrToStrA(lpPrinterInfo.pServerName) .ShareName = PtrToStrA(lpPrinterInfo.pShareName) .Status = lpPrinterInfo.Status End With PrinterFault: ' Cierra la impresora. ' r = ClosePrinter(hPrinter)
End Function
Function PtrToStrA(ByVal lpAnsiStr As Long) As String ' Esta función convierte un puntero de cadena ANSI ' en una variable String. ' Dim sData$ Dim lLen&
lLen = lstrlenptr(lpAnsiStr) sData = String$(lLen, 0) If ReadProcessMemory(GetCurrentProcess(), lpAnsiStr, ByVal sData, lLen) Then PtrToStrA = sData End If End Function
La función GetPrinterInfo sólo necesita un argumento y es el nombre del dispositivo de impresión al que se desea consultar. Para obtener una lista de las impresoras VB proporciona la colección Printers, que se puede recorrer con un bucle For Each...Next Por ejemplo: Sub EnumPrinterInfo() Dim lpInfo As PrinterInfo Dim csPrinter
For Each csPrinter In Printers lpInfo = GetPrinterInfo(csPrinter.DeviceName) Debug.Print "La impresora " & lpInfo.PrinterName & " tiene " _ & lpInfo.Jobs & " trabajos en cola."
Next End Sub
Saludos. Angellore.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Enlace con javascript no cambia a estado visitado
Desarrollo Web
|
MA40
|
2
|
3,249
|
27 Septiembre 2011, 14:01 pm
por MA40
|
|
|
SSD - su estado
Hardware
|
Zorronde
|
2
|
2,236
|
26 Abril 2013, 20:21 pm
por Zorronde
|
|
|
pc en mal estado
Hardware
|
elezekiel
|
4
|
3,227
|
12 Noviembre 2014, 19:00 pm
por Randomize
|
|
|
Saber el estado de la impresora antes de imprimir con C++
Programación C/C++
|
elosopedrozo
|
2
|
2,599
|
6 Marzo 2016, 10:44 am
por Eternal Idol
|
|
|
¿Cómo mantener tu impresora en buen estado?
Noticias
|
wolfbcn
|
1
|
1,514
|
22 Septiembre 2016, 04:23 am
por dato000
|
|