按名称VB选择特定打印机



我编写了一个程序,它将在启动时运行,要求用户选择其默认打印机。该代码显示了ComboBox中所有已安装的打印机,submit按钮将在ComboBox中选择的打印机设置为该用户的默认打印机。

是否有一种方法可以只显示包含特定文本的打印机名称?
例如:

ABC
printer1ABC
network1 abc
printer2 def
network2def

所以它只显示printer1ABCnetwork1 abc?这是我到目前为止的代码(一个ComboBox和一个Button)

Imports System.Drawing.Printing
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim strInstalledPrinters As String
Dim prntDoc As New PrintDocument
'check if there is installed printer
If PrinterSettings.InstalledPrinters.Count = 0 Then
MsgBox("No printer installed")
Exit Sub
End If
'display installed printer into combobox list item
For Each strInstalledPrinters In PrinterSettings.InstalledPrinters
ComboBox1.Items.Add(strInstalledPrinters)
Next strInstalledPrinters
'Display current default printer on combobox texts
ComboBox1.Text = prntDoc.PrinterSettings.PrinterName
Button1.Text = "Set Default Printer"
End Sub
End Class

设置打印机为默认值的功能:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Shell(String.Format("rundll32 printui.dll,PrintUIEntry /y /n ""{0}""", ComboBox1.Text))
MsgBox("You have changed your default printer")
Me.Close()
End Sub

谢谢你的帮助

prinintersettings。installeprinters是一个字符串集合,它枚举可用的打印机名称。您可以通过不同的方式筛选此集合,以仅选择要显示的打印机。

在这里,使用LINQ的Where()方法,对集合进行筛选,选择包含您正在查找的部分名称的字符串:

dim myPrinters = PrinterSettings.InstalledPrinters.OfType(Of String).
Where(Function(p) p.Contains("1ABC")).ToList()

可以添加OrElse条件以包含其他过滤器。如:

.Where(Function(p) p.Contains("1ABC") OrElse p.StartsWith("Network1"))

在枚举打印机之前,您应该验证假脱机程序服务是否实际可用。可通过ServiceController类检查spoolerStatus属性。service,查看它是否为servicecontrolerstatus。跑步并采取行动。如果假脱机程序未运行,则尝试以任何方式枚举可用打印机时将得到异常。
▶为System.ServiceProcess程序集添加项目参考。

当您尝试执行此枚举时,还可以根据不同的条件获得其他异常,因此最好捕获这些异常并做出不同的选择。

一个例子:
作为一个建议,给你的控件有意义的名字,以防这些是你实际使用的名字

Imports System.Drawing.Printing
Imports System.Linq
Imports System.ServiceProcess
Private Const RPC_ERROR As Integer = 1722
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Button1.Text = "Set Default Printer"
Button1.Enabled = False
Dim spoolerStatus = New ServiceController("spooler").Status
If spoolerStatus = ServiceControllerStatus.Running Then
Try
Dim myPrinters = PrinterSettings.InstalledPrinters.OfType(Of String).
Where(Function(p) p.Contains("1ABC")).ToList()
If myPrinters.Count > 0 Then
ComboBox1.DataSource = myPrinters
Button1.Enabled = True
Else
ComboBox1.Items.Add("<Printer not installed>")
End If
Catch wEx As Win32Exception
If wEx.NativeErrorCode = RPC_ERROR Then
' RPC Server unavailable
ComboBox1.Items.Add($"<{wEx.Message}>")
Else
' Log Message
MessageBox.Show(wEx.Message)
ComboBox1.Items.Add("<Error>")
End If
Catch ex As Exception
' Log Message
MessageBox.Show(ex.Message)
ComboBox1.Items.Add("<Error>")
End Try
Else
ComboBox1.Items.Add("<Spooler Service not available>")
End If
ComboBox1.SelectedIndex = 0
End Sub

要更改默认打印机,我建议使用SetdefaultPrinter Win32函数或相应的WMI的Win32_Printer类SetdefaultPrinter方法。

▶当你点击按钮设置新的默认打印机时,使用GetItemText()方法来获取ComboBox1.SelectedItem内容,不要依赖于该控件的Text属性。

Imports System.Runtime.InteropServices
<DllImport("winspool.drv", CharSet:=CharSet.Auto, SetLastError:=True)>
Friend Shared Function SetDefaultPrinter(printerName As String) As Boolean
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim printeNname = ComboBox1.GetItemText(ComboBox1.SelectedItem)
If SetDefaultPrinter(printeNname) Then
MessageBox.Show($"Your default printer is now {printeNname}")
Else
MessageBox.Show("Couldn't change the default printer")
End If
Me.Close()
End Sub

最新更新