Rubrik: Drucker | VB-Versionen: VB2005, VB2008 | 18.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 Prelle | Bewertung: | Views: 27.018 |
www.visual-basic5.de | System: 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