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 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 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 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 ' 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 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 27.017 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
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. |
vb@rchiv CD Vol.6 Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 Neu! sevEingabe 3.0 Einfach stark! Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. |
||||||||||||||||
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. |