按名称选择特定打印机 VB
Selecting specific printer by name VB
我制作了一个程序,它会在启动时 运行 要求用户 select 他们的默认打印机。该代码在 ComboBox 中显示所有已安装的打印机,提交按钮会将 ComboBox 中 selected 的打印机设置为该用户的默认打印机。
有没有办法只显示包含特定文本的打印机名称?
例如:
ABC
printer1ABC
network1 abc
printer2 def
network2def
所以它只会显示 printer1ABC
和 network1 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
感谢您的帮助
PrinterSettings.InstalledPrinters 是枚举可用打印机名称的字符串集合。您可以用不同的方式过滤此集合,以 select 只显示您想要显示的打印机。
在这里,使用 LINQ 的 Where() 方法,集合被过滤 select 在包含您要查找的部分名称的字符串中:
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"))
在枚举打印机之前,您应该验证 Spooler 服务是否实际可用。您可以使用 ServiceController class to check the Status
property of the spooler
service, to see if it's ServiceControllerStatus.Running 并对其进行操作。如果 Spooler 不是 运行,则在您尝试以任何方式枚举可用打印机时都会出现异常。
► 添加对 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 function or the corresponding WMI's Win32_Printer class SetDefaultPrinter方法。
► 当你点击你的按钮来设置新的默认打印机时,使用 GetItemText() 方法来获取 ComboBox1.SelectedItem
内容,不要依赖它的文本 属性控制.
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
我制作了一个程序,它会在启动时 运行 要求用户 select 他们的默认打印机。该代码在 ComboBox 中显示所有已安装的打印机,提交按钮会将 ComboBox 中 selected 的打印机设置为该用户的默认打印机。
有没有办法只显示包含特定文本的打印机名称?
例如:
ABC
printer1ABC
network1 abc
printer2 def
network2def
所以它只会显示 printer1ABC
和 network1 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
感谢您的帮助
PrinterSettings.InstalledPrinters 是枚举可用打印机名称的字符串集合。您可以用不同的方式过滤此集合,以 select 只显示您想要显示的打印机。
在这里,使用 LINQ 的 Where() 方法,集合被过滤 select 在包含您要查找的部分名称的字符串中:
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"))
在枚举打印机之前,您应该验证 Spooler 服务是否实际可用。您可以使用 ServiceController class to check the Status
property of the spooler
service, to see if it's ServiceControllerStatus.Running 并对其进行操作。如果 Spooler 不是 运行,则在您尝试以任何方式枚举可用打印机时都会出现异常。
► 添加对 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 function or the corresponding WMI's Win32_Printer class SetDefaultPrinter方法。
► 当你点击你的按钮来设置新的默认打印机时,使用 GetItemText() 方法来获取 ComboBox1.SelectedItem
内容,不要依赖它的文本 属性控制.
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