vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Drucker   |   VB-Versionen: VB2005, VB200818.04.08
Drucker ermitteln / Drucker setzen (WMI)

Mit diesen Klassen lassen sich alle im System installierten Drucker ermitteln, sowie ein bestimmter Drucker systemweit als neuer Standard-Drucker setzen.

Autor:   Heinz PrelleBewertung:     [ Jetzt bewerten ]Views:  26.969 
www.visual-basic5.deSystem:  WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Mit den nachfolgenden Klassen lassen sich alle im System installierten Drucker ermitteln, sowie ein bestimmter Drucker systemweit als neuer Standard-Drucker setzen.

Das Ganze funktioniert aber erst ab Windows XP, so dass eine enstprechende Betriebssystem-Abfrage erfolgen sollte, was über die OS-Klasse erledigt werden kann.

Für den Zugriff auf die WMI-Funktionen von Windows benötigen Sie in Ihrem Projekt zunächst einen Verweis auf das System.Management-Objekt (Projekt - Eigenschaften - Verweise).

Erstellen Sie ein neues Projekt, platzieren auf die Form ein ListBox-Control, sowie zwei Schaltflächen (Button1 und Button2) über die die Liste der verfügbaren Drucker geladen bzw. ein neuer Drucker systemweit als Standard-Drucker festgelegt werden kann.

Fügen Sie nun nachfolgenden Code in den Codeteil der Form1 ein:

' Benötigte zusätzliche Verweise
Imports System.Management              ' WMI
Imports System.Collections.Specialized ' StringCollection
Imports System.Environment             ' OS
 
Public Class Form1

Die Klasse Printers
Diese Klasse ermittelt alle verügbaren Drucker und gibt deren Namen als StringCollection zurück.

  Public Class Printers
    ''' <summary>
    ''' Eingetragene Drucker ermitteln und an StringCollection zur 
    ''' Ausgabe übergeben
    ''' </summary>
    Public Shared Function GetPrinters() As StringCollection
      'Beöetigte Variablen deklarieren
      Dim sc As StringCollection = New StringCollection()
      Dim scope As String = "ROOT\CIMV2"
      Dim query As String = "Select * from Win32_Printer"
 
      Dim Printers As New ManagementObjectSearcher(scope, query)
 
      ' Schleife durchlaufen und ermittelte Drucker an...
      ' StringCollection übergeben
      For Each Printer As ManagementObject In Printers.Get()
        Dim PrinterDescription As String = _
          DirectCast(Printer.GetPropertyValue("Name"), String)
        sc.Add(PrinterDescription)
      Next
      Return sc
    End Function
  End Class

Die Klasse OS
Diese Klasse ermittelt das installierte Betriebssystem und gibt über die Funktion "IsWindowsXPOrHigher" zurück, ob Windows XP oder ein neueres System verwendet wird.

  Public Class OS
    '                Win98  WinMe  WinNT  Win2K  WinXP  Server2003  Vista/Longhorn
    ' Platform          1      1      2      2      2        2          2
    ' Version.Major     4      4      4      5      5        5          6
    ' Version.Minor    10     90      0      0      1        2          0
 
    ''' <summary>
    ''' Betriebsystem ermitteln
    ''' </summary>
    Public Shared Function IsWindowsXPOrHigher() As Boolean
      If OSVersion.Platform <> PlatformID.Win32NT OrElse _
        OSVersion.Version < New Version(5, 1) Then
        ' Stimmt das Ergebnis mit dem Vergleich ueberein 
        ' wird True zurueckgegeben...
        Return False
      Else
        ' ... sonst False
        Return True
      End If
    End Function
  End Class

Die Klasse SetPrinter
Mit dieser Klasse lässt sich ein bestimmter Drucker systemweit als neuer Standard-Drucker festlegen.

  Public Class SetPrinter
    ''' <summary>
    ''' Neuen Standard-Drucker systemweit setzen
    ''' </summary>
    Public Shared Function ChangePrinter(ByVal PrinterName As String) As Boolean
      ' Benötigte Variablen
      Dim scope As String = "ROOT\CIMV2"
      Dim query As String = "Select * from Win32_Printer"
      Const DefaultPrinter As String = "SetDefaultPrinter"
      Const ReturnValue As String = "ReturnValue"
 
      ' Fehlerüberwachung einschalten
      Try
        Dim Printers As New ManagementObjectSearcher(scope, query)
        For Each Printer As ManagementObject In Printers.Get()
          Dim PrinterDescription As String = _
            DirectCast(Printer.GetPropertyValue("Name"), String)
          ' Vergleichsvariable deklarieren und initialisieren
          Dim Compared As Integer = String.Compare( _
            PrinterDescription, PrinterName, True)
          ' Übergebenen Drucker mit vorhandenen Druckern vergleichen.
          ' Stimmt der übergebene Drucker mit dem Vergleich überein 
          ' wird der übergebene Drucker...
          If Compared = 0 Then
            ' ... als Standarddrucker systemweit gesetzt
            Dim mbo As ManagementBaseObject = _
              Printer.InvokeMethod(DefaultPrinter, Nothing, Nothing)
            ' Ist das Rückgabeergebnis = 0 gibt die Funktion...
            If CType(mbo.Properties(ReturnValue).Value, Int32) = 0 Then
              ' True zurueck
              Return True
            End If
          End If
        Next
      Catch ex As Exception
        ' Eventuell auftretenden Fehler abfangen 
        ' Fehlermeldung ausgeben
        MessageBox.Show(ex.Message.ToString(), "Info")
      End Try
      Return False
    End Function
 
    ''' <summary>
    ''' Ausgabe eines Hinweises ob der Vorgang erfolgreich war
    ''' </summary>
    Public Shared Sub OutPutMessage(ByVal State As Boolean)
      Dim sMsg As String = ""
      Select Case State
        Case True
          sMsg = "Der ausgewählte Drucker wurde gesetzt."
        Case Else
          sMsg = "Der ausgewählte Drucker konnte nicht gesetzt werden."
      End Select
      MessageBox.Show(sMsg, "Info")
    End Sub
  End Class

Anzeigen aller verfügbaren Drucker
Über die Schaltfläche "Button1" werden alle verfügbaren Drucker ermittelt und in die ListBox eingetragen. Für Testzwecke tragen wir hier auch noch einen nicht vorhandenen Drucker ein

  ' alle verfügbaren Drucker anzeigen
  Private Sub Button1_Click(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles Button1.Click
 
    ' Button deaktivieren
    Button1.Enabled = False
 
    ' Fehlerüberwachung einschalten
    Try
      ' Sanduhr einblenden
      Me.Cursor = Cursors.WaitCursor
 
      ' StringCollection deklarieren und initialisieren
      Dim sc As StringCollection = Printers.GetPrinters()
 
      ' Enthält die StringCollection Daten dann...
      If sc IsNot Nothing Then
        ' ... StringCollection in einer Schleife durchlaufen...
        For Each Printer As String In Printers.GetPrinters()
          ' und die Einträge an die ListBox übergeben
          ListBox1.Items.Add(Printer)
        Next
        ' Zum Testen eines nicht vorhandenen Drucker...
        ListBox1.Items.Add("(Fehler Drucker - zum Testen)")
      Else
        ' Enthält die StringCollection keine Daten, Hinweis anzeigen
        Me.Cursor = Cursors.Default
        MessageBox.Show("Es konnten keine Drucker ermittelt werden.", "Info")
      End If
    Catch ex As Exception
      ' Eventuell auftretenden Fehler abfangen und Hinweis anzeigen
      Me.Cursor = Cursors.Default
      MessageBox.Show(ex.Message.ToString(), "Info")
    End Try
 
    ' Standard-Mauszeiger wiederherstellen
    Me.Cursor = Cursors.Default
 
    ' Button wieder aktivieren
    Button1.Enabled = True
  End Sub

Neuen Drucker systemweit festlegen
Beim Klick auf die zweite Schaltfläche (Button2) soll der gerade in der Liste ausgewählte Drucker systemweit als neuer Standard-Drucker festgelegt werden.

  Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
 
    ' Button für "Standard-Drucker setzen" aktivieren/deaktivieren
    Button2.Enabled = (ListBox1.SelectedIndex >= 0)
  End Sub
  ' Ausgewählten Drucker systemweit als neuen Standard-Drucker setzen
  Private Sub Button2_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button2.Click
 
    ' Fehlerueberwachung einschalten
    Try
      ' Dieses Beispiel läuft ab Windows XP. Daher wird zunächst
      ' das verwendete Betriebssystem geprüft
      If Not OS.IsWindowsXPOrHigher Then
        MessageBox.Show("Das Beispiel wird erst ab Windows XP unterstützt!", "Info")
        Exit Sub
      Else
        ' ChangePrinter mit neuem Drucker aufrufen...
        Dim bResult As Boolean = SetPrinter.ChangePrinter( _
          Me.ListBox1.SelectedItem.ToString())
        ' ... und eine Meldung über den Status des Vorgangs ausgegeben
        SetPrinter.OutPutMessage(bResult)
      End If
    Catch ex As Exception
      ' Eventuell auftretenden Fehler abfangen und Hinweis anzeigen
      MessageBox.Show(ex.Message.ToString(), "Info")
    End Try
  End Sub
End Class

Dieser Tipp wurde bereits 26.969 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel