gewünschten Drucker auswählen

  • VB.NET

Es gibt 39 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    Jep, da war ich auch schon. Grundsätzlich kommte ich damit zu folgendem Code:

    VB.NET-Quellcode

    1. For Each Printer In New ManagementObjectSearcher("SELECT * from Win32_Printer").Get
    2. Dim PrinterName = Printer.Properties.Cast(Of PropertyData).FirstOrDefault(Function(x) x.Name = "Caption").Value.ToString
    3. Dim PrinterStatus = Printer.Properties.Cast(Of PropertyData).FirstOrDefault(Function(x) x.Name = "PrinterState").Value
    4. 'ListBox1.Items.Add($"{PrinterName}: {PrinterStatus}")
    5. Next

    Hier die passende Statustabelle.
    Es wird mir korrekt angezeigt, wenn mein Drucker online ist und dass der Tonerstatus niedrig ist. Und wenn ich ihn ausmache, kommt korrekt 128 zurück. Allerdings wird für alle anderen Drucker (der im Keller, virtuelle Drucker wie PdfCreator, Microsoft Print To PDF, ...) der Wert 0 zurückgegeben. Und das ist falsch.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    hmm....also ich verstehe es nicht...
    ist es richtig das in der Listbox sämtliche Daten aufgeführt werden???
    Von jeden USB Gerät???

    Quellcode

    1. For Each Printer In New ManagementObjectSearcher("SELECT * from Win32_Printer").Get
    2. Dim PrinterName = Printer.Properties.Cast(Of PropertyData).FirstOrDefault(Function(x) x.Name = "Caption").Value.ToString
    3. Dim PrinterStatus = Printer.Properties.Cast(Of PropertyData).FirstOrDefault(Function(x) x.Name = "PrinterState").Value
    4. For Each prop As PropertyData In Printer.Properties
    5. Me.ListBox2.Items.Add(String.Format("{0}: {1}", prop.Name, prop.Value))
    6. Next
    7. Next


    Wollte doch nur einen Drucker und nicht Drucker die es nicht mehr gibt... :/
    ?(
    Bei mir korreliert es:

    USB-Geräte habe ich, aber aufgelistet werden die nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Post#22, Zeile#4-#6

    VB.NET-Quellcode

    1. For Each prop As PropertyData In Printer.Properties
    2. Me.ListBox2.Items.Add(String.Format("{0}: {1}", prop.Name, prop.Value))
    3. Next

    Du listest alle Printerproperties auf. Ich nicht, siehe Post#21. Ich pick mir nur den Status raus.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Otti schrieb:

    was mache ich falsch?
    Du vermischst zwei Snippets:

    VB.NET-Quellcode

    1. For Each prop As PropertyData In Printer.Properties
    2. Me.ListBox2.Items.Add(String.Format("{0}: {1}", prop.Name, prop.Value))
    3. Next

    @VaporiZed Mit Hardware getestet: Funktioniert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „RodFromGermany“ ()

    @VaporiZed @RodFromGermany

    Moin Ihr beiden...

    VB.NET-Quellcode

    1. For Each Printer In New ManagementObjectSearcher("SELECT * from Win32_Printer").Get
    2. Dim PrinterName = Printer.Properties.Cast(Of PropertyData).FirstOrDefault(Function(x) x.Name = "Caption").Value.ToString
    3. Dim PrinterStatus = Printer.Properties.Cast(Of PropertyData).FirstOrDefault(Function(x) x.Name = "PrinterState").Value
    4. Me.ListBox2.Items.Add(String.Format("{0}: {1}", PrinterName, PrinterStatus))
    5. Next


    Soweit klappt es nun allerdings, bekomme ich nur von einem "LAN" Drucker die richtige Rückmeldung.
    Der kleine USB Drucker zeigt immer Status "0" an was nicht stimmt, da er aus ist...

    Woran kann das liegen??? Habt Ihr eine Idee???

    Bilder
    • Unbenannt.PNG

      3,99 kB, 210×150, 351 mal angesehen
    siehe Post#21, die letzten beiden Zeilen

    ##########

    @RodFromGermany & @Otti: Leute! Ich sag doch die ganze Zeit, dass der Code noch nicht passt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed @Otti
    Wir sind noch nicht am Ende.
    Drucker An: aus der 128 wird eine 0.
    Drucker wieder aus: 0 bleibt stehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @VaporiZed

    Ohh...Überlesen...Hast du eine Idee woran es liegt???

    Bin da noch nicht so firm drin, hat man eine Möglichkeit den USB Port abzufragen, an dem der Drucker angeschlossen ist, ob da bei eingeschaltetem Drucker ein Signal zurück kommt???

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Otti“ ()

    @Otti @VaporiZed Die Meldungen sind retardiert, nach einer Weile kam da wieder die 128.
    Allerdings gibt es da PrinterState und PrinterStatus. Müsste man beide mal überwachen:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Otti schrieb:

    USB Port überwachen???
    Warum so viele Fragezeichen????????
    Einen USB-Anschluss kannst Du nur dahingehend überwachen, ob es gesteckt oder gezogen wird.
    Für alles weitere brauchst Du den richtigen Treiber.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @VaporiZed @RodFromGermany

    Hatte mal im Netz was gefunden, das man von einem USB Stick die ID herrausfindet...

    VB.NET-Quellcode

    1. Function getDeviceID()
    2. Try
    3. Dim ms As ManagementObjectSearcher = New ManagementObjectSearcher("SELECT * from Win32_diskdrive where interfacetype = 'USB'")
    4. For Each mo As ManagementObject In ms.Get()
    5. For Each Data As PropertyData In mo.Properties
    6. If Data.Name = "PNPDeviceID" Then
    7. DeviceID = Convert.ToString(Data.Value)
    8. Dim ArrUSBInfo() As String = DeviceID.split("\")
    9. Return ArrUSBInfo(UBound(ArrUSBInfo))
    10. End If
    11. Next
    12. Next
    13. Catch ex As Exception
    14. Return 0
    15. End Try
    16. End Function
    17. Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    18. Try
    19. ListBox2.Items.Add(getDeviceID())
    20. Catch ex As Exception
    21. ListBox2.Items.Add("Kein Drucker")
    22. End Try
    23. End Sub

    Ein Drucker muss doch auch eine ID haben oder nicht?
    @VaporiZed @RodFromGermany

    So bin ein bischen weiter gekommen...frag mich gerade nur wie...verstehen tue ich das auch nicht.
    Beim ersten Button Klick, wird mir 2mal untereinander der Drucker angezeigt "POS80"
    Beim nächsten klick der Name und Status 64 (Ist Drucker an)
    Dann beim Klick, Name und Status 1088 (Drucker an)
    Dann beim erneuten klick wieder Drucker an
    Status stimmt auf jeden fall...

    Wie bekomme ich denn den Druckername weg, und wieso beim ersten klick zweimal der Name???
    Könnt ihr mir einen Tip geben ?!?!

    VB.NET-Quellcode

    1. Function getDeviceID()
    2. Try
    3. Dim ms As ManagementObjectSearcher = New ManagementObjectSearcher("SELECT * from Win32_Printer")
    4. For Each mo As ManagementObject In ms.Get()
    5. For Each Data As PropertyData In mo.Properties
    6. If Me.ListBox2.Items.Add(mo("Caption")) Then
    7. DeviceID = Convert.ToString(Data.Value)
    8. Dim ArrUSBInfo() As String = DeviceID.Split("\")
    9. Return ArrUSBInfo(UBound(ArrUSBInfo))
    10. End If
    11. Next
    12. Next
    13. Catch ex As Exception
    14. Return 0
    15. End Try
    16. End Function
    17. Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    18. Try
    19. ListBox2.Items.Add(getDeviceID())
    20. Catch ex As Exception
    21. End Try
    22. End Sub



    Hab es...einfach den If Befehl weg lassen :P
    Könnt Ihr ja mal prüfen, vielleicht geht es noch bischen besser..
    Bilder
    • Unbenannt.PNG

      1,67 kB, 83×145, 324 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Otti“ ()

    Otti schrieb:

    VB.NET-Quellcode

    1. If Me.ListBox2.Items.Add(mo("Caption")) Then
    Weil Du ihn zwei Mal hinzufügst. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielleicht hilft das. Ich habe das in meiner Software eingebaut.
    Jedoch ist es richtig, dass nicht alle Netzwerkdrucker korrekte Informationen zurückliefern. USB Drucker aber schon.

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Übergibt False, wenn der Drucker aus welchem Grund auch immer nicht druckbereit ist
    3. ''' In dieser Funktion wird "ErrorLog" verwendet - diese schreibt lediglich ein Logfile im Falle von offline, paper out oder disconnect
    4. ''' </summary>
    5. ''' <param name="Drucker"></param>
    6. ''' <returns></returns>
    7. ''' <remarks></remarks>
    8. Public Function isPrinterOnline(Drucker As String) As Boolean
    9. Dim Online As Boolean = False
    10. Dim scope As ManagementScope = New ManagementScope("\root\cimv2")
    11. scope.Connect()
    12. Dim searcher As ManagementObjectSearcher = New ManagementObjectSearcher("SELECT * FROM Win32_Printer")
    13. Dim collection As ManagementObjectCollection = searcher.Get
    14. For Each printer As ManagementObject In collection
    15. If printer("Name").ToString() = Drucker Then
    16. If printer("WorkOffline").ToString().ToLower().Equals("true") Then
    17. ErrorLog(Drucker + " offline (user)") 'Error-Logfile Eintrag
    18. Online = False
    19. Else
    20. Online = True
    21. End If
    22. Dim x1 As UShort = CUShort(printer("PrinterStatus"))
    23. Dim x2 As UShort = CUShort(printer("ExtendedDetectedErrorState"))
    24. Dim x3 As UInteger = CUInt(printer("PrinterState"))
    25. If x1 < 3 Or x1 > 4 Then Online = False
    26. If x2 <> 0 Then Online = False
    27. If x3 <> 0 And x3 <> 1024 Then Online = False '1024=busy
    28. If x3 = 144 Then ErrorLog(Drucker + " no Paper") ' Error-Logfile Eintrag
    29. If x3 = 4096 Then ErrorLog(Drucker + " not on") ' Error-Logfile Eintrag
    30. End If
    31. Next
    32. Return Online
    33. End Function
    34. ''' <summary>
    35. ''' Eine Logdatei in der alle intenen Fehler geschrieben werden
    36. ''' </summary>
    37. ''' <param name="Logeintrag"></param>
    38. ''' <remarks></remarks>
    39. Public Sub ErrorLog(Logeintrag As String)
    40. GlobalErrorString += Logeintrag + vbCrLf
    41. Dim file As Integer
    42. Dim Dateiname As String = Now.Year.ToString + "_" + Now.Month.ToString + "_EventLog.txt"
    43. Dim FlexX_Datenverzeichnis as string="c:"
    44. file = FreeFile()
    45. Try
    46. FileOpen(file, Path.Combine(FlexX_Datenverzeichnis, Dateiname), OpenMode.Append, OpenAccess.Write, OpenShare.LockWrite)
    47. PrintLine(file, Now.ToString + " | " + Logeintrag)
    48. FileClose(file)
    49. Catch
    50. End Try
    51. End Sub


    Ich bin mir nicht mehr ganz sicher welche Module für obigen Code benötigt werden. Hier alle die ich in meiner Bibliothek aufrufe. Einfach alles reinnehmen und Zeile für Zeile wegnehmen und schauen welches Modul gebraucht wird:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports System.IO.Ports
    4. Imports System.Text
    5. Imports System.Net
    6. Imports System.Net.Mail
    7. Imports System.Runtime.CompilerServices
    8. Imports System.Management
    9. Imports System.Drawing.Printing
    10. Imports System.Printing
    11. Imports System.Diagnostics
    12. Imports System.Security.Principal
    13. Imports System.Drawing
    14. Imports Microsoft.Win32

    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @dive26 Da hast Du aber nen schrottigen ErrorLog:

    VB.NET-Quellcode

    1. Public Sub ErrorLog(Logeintrag As String)
    2. GlobalErrorString += Logeintrag + vbCrLf
    3. Dim Dateiname = "c:\Temp\" + DateTime.Now.ToString("yyyy-MM") + "_EventLog.txt"
    4. System.IO.File.AppendAllText(Dateiname, DateTime.Now.ToString & " | " & Logeintrag & Environment.NewLine)
    5. End Sub

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja ich weis ;-). Ist noch ein Relikt von 2013 als ich die Software zu schreiben begonnen habe ;)
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at