Drucker verfügbar, Drucker nicht verfügbar?

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Roberto.

    Drucker verfügbar, Drucker nicht verfügbar?

    Hallo zusammen,

    ich hab mal wieder so eine komische Frage.
    Eine richtige Lösung konnte ich noch nicht finden.
    Mir geht es darum einen bestimmten Drucker zu erkennen ob er online ist oder nicht.
    Beispiel vom Betriebssysten:
    In Bereich Drucker & Scanner werden die Drucker angezeigt.
    Wenn ein Drucher aktiv wird nur der Druckername angezeigt. OK.
    Wenn der Drucker aus ist wird 'Nicht verfügbar' angezeigt.
    Das ist ja dann auch OK.
    Nur würde ich gerne das in VB.Net erreichen ohne das Betriebssystem zu benutzen.
    Vieles habe ich gefunden nur eben das nicht.
    Tja, wie könnte es gehen.
    Wie heißt es so schon 'Mit etwas Glück haben Sie einen Treffer' im Glückspiel.
    Alles Lüge. Mit viel Glück muss es heissen.
    Vieleicht habe ich hier im Forum etwas Glück.
    Grüße an die Kollegen
    Roberto
    leider kann ich es nicht testen, da ich keinerlei drucker zuhause hab, aber rein theoretisch mit:

    VB.NET-Quellcode

    1. ​Private Sub SurroundingSub()
    2. Dim printerQuery = New ManagementObjectSearcher("SELECT * from Win32_Printer")
    3. For Each printer In printerQuery.[Get]()
    4. Dim name = printer.GetPropertyValue("Name")
    5. Dim status = printer.GetPropertyValue("Status")
    6. Dim isDefault = printer.GetPropertyValue("Default")
    7. Dim isNetworkPrinter = printer.GetPropertyValue("Network")
    8. Console.WriteLine("{0} (Status: {1}, Default: {2}, Network: {3}", name, status, isDefault, isNetworkPrinter)
    9. Next
    10. End Sub


    eine Liste erstellen, von allen verfügbaren druckern, und anschließend diese Liste prüfen ob der gewünschte drucker in der Liste der verfügbaren enthalten ist. Angabe ohne gewähr :P
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    @Roberto Probier mal dies:
    Form mit 3 Button und 2 Listboxen, Verweis auf System.Management:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Drawing.Printing
    2. Imports System.Management
    3. Public Class Form1
    4. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    5. ListBox1.Items.Clear()
    6. ListBox2.Items.Clear()
    7. For Each printer In PrinterSettings.InstalledPrinters
    8. 'ListBox1.Items.Add(printer) ' vorhanden
    9. If CheckPrinter(printer.ToString) Then
    10. ListBox1.Items.Add(printer) ' verfügbar
    11. End If
    12. Next
    13. End Sub
    14. Private Function CheckPrinter(ByVal printerName As String) As Boolean
    15. Try
    16. Dim printDocument As PrintDocument = New PrintDocument()
    17. printDocument.PrinterSettings.PrinterName = printerName
    18. Return printDocument.PrinterSettings.IsValid
    19. Catch
    20. End Try
    21. Return False
    22. End Function
    23. Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
    24. ListBox2.Items.Clear()
    25. If ListBox1.SelectedItem Is Nothing Then
    26. MessageBox.Show("Please select a Printer")
    27. Return
    28. End If
    29. Dim printerName As String = ListBox1.SelectedItem.ToString
    30. Dim query As String = String.Format("SELECT * from Win32_Printer WHERE Name LIKE '%{0}'", printerName)
    31. Using searcher As ManagementObjectSearcher = New ManagementObjectSearcher(query)
    32. Using coll As ManagementObjectCollection = searcher.Get()
    33. Try
    34. For Each printer As ManagementObject In coll
    35. For Each prop As PropertyData In printer.Properties
    36. If prop.Value IsNot Nothing Then
    37. If Not String.IsNullOrWhiteSpace(prop.Value.ToString) Then
    38. If TypeOf (prop.Value) Is String() Then
    39. Me.ListBox2.Items.Add(String.Format("{0}:", prop.Name))
    40. Dim strings = CType(prop.Value, String())
    41. For Each St In strings
    42. Me.ListBox2.Items.Add(String.Format(" {0}", St))
    43. Next
    44. Else
    45. Me.ListBox2.Items.Add(String.Format("{0}: {1}", prop.Name, prop.Value))
    46. End If
    47. End If
    48. End If
    49. Next
    50. Next
    51. Catch ex As ManagementException
    52. Console.WriteLine(ex.Message)
    53. End Try
    54. End Using
    55. End Using
    56. End Sub
    57. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    58. ListBox2.Items.Clear()
    59. For Each Printer In New ManagementObjectSearcher("SELECT * from Win32_Printer").Get
    60. Dim PrinterName = Printer.Properties.Cast(Of PropertyData).FirstOrDefault(Function(x) x.Name = "Caption").Value.ToString
    61. Dim PrinterState = Printer.Properties.Cast(Of PropertyData).FirstOrDefault(Function(x) x.Name = "PrinterState").Value
    62. Dim PrinterStatus = Printer.Properties.Cast(Of PropertyData).FirstOrDefault(Function(x) x.Name = "PrinterStatus").Value
    63. ListBox2.Items.Add(String.Format("{0}: {1}, {2}", PrinterName, PrinterState, PrinterStatus))
    64. Next
    65. End Sub
    66. End Class
    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!