Esta la Impresora Encendida, pausada, off line????

22/07/2003 - 22:49 por FlavioNarvaez | Informe spam
Hay alguien que efectivamente pueda detectar este tipo de
estados en Win9x?

Tengo codigo API y WMI pero ninguno se da cuenta si la
impresora esta apagada o su estatus verdadero hasta no
mandar un trabajo de impresion. --Y asi no sirve de nada--

Please Help!

Preguntas similare

Leer las respuestas

#1 Guillermo Rey
22/07/2003 - 23:51 | Informe spam
Hola Flavio:

Yo tampoco he encontrado nada, te agradecería que em enviases los
codigos que tienes por si me dan pistas. Si encontrase algo con mucho gusto
te lo mandaría.

Un abrazo

Guillermo Rey
Vigo (SPAIN)
Desarrollo VB y VBA
www.guillermorey.com


"FlavioNarvaez" escribió en el mensaje
news:042601c35092$c40ba290$
Hay alguien que efectivamente pueda detectar este tipo de
estados en Win9x?

Tengo codigo API y WMI pero ninguno se da cuenta si la
impresora esta apagada o su estatus verdadero hasta no
mandar un trabajo de impresion. --Y asi no sirve de nada--

Please Help!
Respuesta Responder a este mensaje
#2 Perico de los palotes
23/07/2003 - 11:12 | Informe spam
Hola, me salgo un poco del hilo de tu pregunta, para hacerte yo una (a ti o
a quien la sepa claro).

Mi jefe quiere saber cuantas hojas se pueden imprimir con el cartucho de
toner (aunque ya le expliqué yo que dependería de la cobertura de cada hoja)
y quiere que le haga un programa que cuente las hojas que se imprimen desde
el ordenador.

Pues la pregunta es la siguiente, como puedo controlar desde un programa
residente (que se iniciaría al arrancar Windows) las impresiones que
realizan otros programas (como por ejemplo Word).

Gracias y perdón por la intromisión.
Respuesta Responder a este mensaje
#3 _JuanE
24/07/2003 - 19:13 | Informe spam
Tranquilidad... que no hay para tanto!

Prueba esto:

Option Explicit

Private Declare Function ClosePrinter Lib "winspool.drv" _
(ByVal hPrinter As Long) As Long

Private Declare Function OpenPrinter Lib "winspool.drv" Alias _
"OpenPrinterA" (ByVal pPrinterName As String, phPrinter _
As Long, pDefault As Any) As Long

Private Declare Function EnumJobs Lib "winspool.drv" Alias _
"EnumJobsA" (ByVal hPrinter As Long, ByVal FirstJob _
As Long, ByVal NoJobs As Long, ByVal Level As Long, _
pJob As Long, ByVal cdBuf As Long, pcbNeeded As _
Long, pcReturned As Long) As Long

Private Declare Function SetJob Lib "winspool.drv" Alias _
"SetJobA" (ByVal hPrinter As Long, ByVal JobId As Long, _
ByVal Level As Long, ByRef pJob As JOB_INFO_1, ByVal _
Command As Long) As Long

Private Declare Function PtrToStr Lib "kernel32" Alias _
"lstrcpyA" (ByVal RetVal As String, ByVal Ptr As _
Long) As Long

Private Declare Function StrLen Lib "kernel32" Alias _
"lstrlenA" (ByVal Ptr As Long) As Long

Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type

Private Type JOB_INFO_1
JobId As Long
pPrinterName As String
pMachineName As String
pUserName As String
pDocument As String
pDatatype As String
pStatus As String
Status As Long
Priority As Long
Position As Long
TotalPages As Long
PagesPrinted As Long
Submitted As SYSTEMTIME
End Type

Const JOB_STATUS_PAUSED = &H1
Const JOB_STATUS_ERROR = &H2
Const JOB_STATUS_DELETING = &H4
Const JOB_STATUS_SPOOLING = &H8
Const JOB_STATUS_PRINTING = &H10Const JOB_STATUS_OFFLINE = &H20
Const JOB_STATUS_PAPEROUT = &H40
Const JOB_STATUS_PRINTED = &H80
Const JOB_STATUS_USER_INTERVENTION = &H10000

Const MAX_PRIORITY = 99
Const MIN_PRIORITY = 1
Const DEF_PRIORITY = 1

Const JOB_CONTROL_PAUSE = 1
Const JOB_CONTROL_RESUME = 2
Const JOB_CONTROL_CANCEL = 3
Const JOB_CONTROL_RESTART = 4
Const JOB_CONTROL_DELETE = 5

Dim Job() As JOB_INFO_1

Private Sub Command1_Click()
Call DisplaySpooler
End Sub

Private Sub Command2_Click(Index As Integer)
Dim x&

'Anmerkung: In Netzwerken benötigen sie zur Ausführung der
' folgenden Aktionen die erforderlichen Rechte,
' andernfalls führen die Commandos zu keiner
' Reaktion.

x = List1.ListIndex
If x > -1 Then
Select Case Index
Case 0: Call JobCmd(x, JOB_CONTROL_CANCEL)
Case 1: Call JobCmd(x, JOB_CONTROL_PAUSE)
Case 2: Call JobCmd(x, JOB_CONTROL_RESUME)
End Select
End If
End Sub

Private Sub DisplaySpooler()
Dim Result&, Required&, BufLen&
Dim Buffer() As Long, Entries&, LiMem
Dim hPrinter&, PName$, l&, x&, aa$
Const c& = 16

BufLen = 1024
ReDim Buffer(BufLen \ 4)

LiMem = List1.ListIndex
List1.Clear

'Standarddruckername erfahren
PName = Printer.DeviceName

'Drucker öffnen
Result = OpenPrinter(PName, hPrinter, 0)
If Result <> 0 Then
'Alles bisher gut gelaufen, jetzt mal abklopfen wieviel
'Platz wir brauchen
Result = EnumJobs(hPrinter, 0, &HFFFFFFFF, 1, Buffer(0), _
BufLen, Required, Entries)

If Result = 0 Or Required = 0 Then
'Dat klappt net
'Printerhandle wieder schließen
Call ClosePrinter(hPrinter)
Exit Sub
Else
'Ist der Puffer groß genug?
If Required > BufLen Then
'Nein ist er nicht, also nochmal
ReDim Buffer(Required \ 4)
Result = EnumJobs(hPrinter, 0, &HFFFFFFFF, 1, Buffer(0), _
BufLen, Required, Entries)
If Result = 0 Then
'Fehler
'Printerhandle wieder schließen
Call ClosePrinter(hPrinter)
Exit Sub
End If
End If

'Printerhandle wieder schließen
Call ClosePrinter(hPrinter)

ReDim Job(0 To Entries - 1)
For x = 0 To Entries - 1

'JobID: Buffer(0)
Job(x).JobId = Buffer(c * x + 0)

'Druckername: Buffer(1)
aa = Space$(StrLen(Buffer(c * x + 1)) + 1)
Call PtrToStr(aa, Buffer(c * x + 1))
aa = Left$(aa, InStr(aa, Chr$(0)) - 1)
Job(x).pPrinterName = aa

'Rechnername: Buffer(2), gleiches Spiel wie oben
aa = Space$(StrLen(Buffer(c * x + 2)) + 1)
Call PtrToStr(aa, Buffer(c * x + 2))
aa = Trim$(Left$(aa, InStr(aa, Chr$(0)) - 1))
Job(x).pMachineName = aa

'Username: Buffer(3), gleiches Spiel wie oben
aa = Space$(StrLen(Buffer(c * x + 3)) + 1)
Call PtrToStr(aa, Buffer(c * x + 3))
aa = Left$(aa, InStr(aa, Chr$(0)) - 1)
Job(x).pUserName = aa

'Dokumentenname
aa = Space$(StrLen(Buffer(c * x + 4)) + 1)
Call PtrToStr(aa, Buffer(c * x + 4))
aa = Left$(aa, InStr(aa, Chr$(0)) - 1)
Job(x).pDocument = aa

'Datentyp
aa = Space$(StrLen(Buffer(c * x + 5)) + 1)
Call PtrToStr(aa, Buffer(c * x + 5))
aa = Left$(aa, InStr(aa, Chr$(0)) - 1)
Job(x).pDatatype = aa

'Jobstatus: Ist dieser Wert gleich nix, dann ist der Status
'über den folgenden Parameter (Buffer(7)) nàher definiert
aa = Space$(StrLen(Buffer(c * x + 6)) + 1)
Call PtrToStr(aa, Buffer(c * x + 6))
If InStr(aa, Chr$(0)) <> 0 Then
aa = Left$(aa, InStr(aa, Chr$(0)) - 1)
Else
aa = ""
End If
Job(x).pStatus = aa

'Status-Flags
Job(x).Status = Buffer(c * x + 7)

'Buffer(8) Spezifiziert die Dringlichkeit.
Job(x).Priority = Buffer(c * x + 8)

'Zeigt die Position des Jobs in der Queue an
Job(x).Position = Buffer(c * x + 9)

'Erzàhlt uns wieviel Seiten es ingesamt sind
Job(x).TotalPages = Buffer(c * x + 10)

'Erzàhlt uns wieviel Seiten davon schon gedruckt wurden
Job(x).PagesPrinted = Buffer(c * x + 11)

'Submitted
With Job(x).Submitted
.wYear = Buffer(c * x + 12) Mod 65536
.wMonth = Buffer(c * x + 12) \ 65536
.wDayOfWeek = Buffer(c * x + 13) Mod 65536
.wDay = Buffer(c * x + 13) \ 65536
.wHour = Buffer(c * x + 14) Mod 65536
.wMinute = Buffer(c * x + 14) \ 65536
.wSecond = Buffer(c * x + 15) Mod 65536
.wMilliseconds = Buffer(c * x + 15) \ 65536
End With
Next x

'Ausgabe
For x = 0 To UBound(Job)
List1.AddItem ConvJobToString(Job(x))
Next x

If List1.ListCount > 0 Then
If LiMem >= List1.ListCount = -1 Or LiMem = -1 Then
LiMem = 0
End If
List1.ListIndex = LiMem
End If
End If
End If
End Sub

Private Function ConvJobToString(jb As JOB_INFO_1) As String
Dim aa$, Stat$

With jb
Stat = PStatusToString(.Status)
aa = CStr(.JobId) & " - "
aa = aa & .pPrinterName & " - "
aa = aa & .pMachineName & " - "
aa = aa & .pUserName & " - "
aa = aa & .pDocument & " - "
aa = aa & .pDatatype & " - "
aa = aa & .pStatus & " [" & Stat & "] - "
aa = aa & .Position & " [" & .Priority & "] - "
aa = aa & .PagesPrinted & " [" & .TotalPages & "] - "
aa = aa & .Submitted.wDay & "." & .Submitted.wMonth & "." & _
.Submitted.wYear & " " & .Submitted.wHour & ":" & _
.Submitted.wMinute & ":" & .Submitted.wSecond
End With
ConvJobToString = aa
End Function

Private Sub JobCmd(JobIndex&, Cmd&)
Dim Result&, hPrinter&, PName$

'Standarddruckername erfahren
PName = Printer.DeviceName

'Drucker öffnen
Result = OpenPrinter(PName, hPrinter, 0)
If Result <> 0 Then
Call SetJob(hPrinter, Job(JobIndex).JobId, 1&, Job(JobIndex), _
Cmd)
Call ClosePrinter(hPrinter)
End If
Call DisplaySpooler
End Sub

Private Function PStatusToString(Flag&) As String
Dim aa$

If Flag And JOB_STATUS_PAUSED Then aa = "PAUSE "
If Flag And JOB_STATUS_ERROR Then aa = aa & "ERROR "
If Flag And JOB_STATUS_DELETING Then aa = aa & "DELETING "
If Flag And JOB_STATUS_SPOOLING Then aa = aa & "SPOOLING "
If Flag And JOB_STATUS_PRINTING Then aa = aa & "PRINTING "
If Flag And JOB_STATUS_OFFLINE Then aa = aa & "OFFLINE "
If Flag And JOB_STATUS_PAPEROUT Then aa = aa & "PAPEROUT "
If Flag And JOB_STATUS_USER_INTERVENTION Then aa = aa & _
"INTERVENTION"
PStatusToString = Trim$(aa)
End Function
'- Ende Formular "Form1" alias Form1.frm -
'-- Ende Projektdatei Project1.vbp --

Lluis franco 19-02-2003

Saludos!


JuanE!, desde Chile
"Perico de los palotes" escribió en el mensaje
news:
Hola, me salgo un poco del hilo de tu pregunta, para hacerte yo una (a ti


o
a quien la sepa claro).

Mi jefe quiere saber cuantas hojas se pueden imprimir con el cartucho de
toner (aunque ya le expliqué yo que dependería de la cobertura de cada


hoja)
y quiere que le haga un programa que cuente las hojas que se imprimen


desde
el ordenador.

Pues la pregunta es la siguiente, como puedo controlar desde un programa
residente (que se iniciaría al arrancar Windows) las impresiones que
realizan otros programas (como por ejemplo Word).

Gracias y perdón por la intromisión.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida