【问题标题】:Selecting specific printer by name VB按名称选择特定打印机 VB
【发布时间】:2021-05-02 18:34:05
【问题描述】:

我制作了一个在启动时运行的程序,要求用户选择他们的默认打印机。代码在 ComboBox 中显示所有已安装的打印机,提交按钮会将 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

感谢您的帮助

【问题讨论】:

  • 当然可以,只需将您的条件条件放入循环中,在该循环中将打印机添加到组合框项目中,并且仅在满足条件时才添加它们

标签: vb.net winforms printing servicecontroller


【解决方案1】:

PrinterSettings.InstalledPrinters 是枚举可用打印机名称的字符串集合。您可以通过不同方式过滤此集合,以仅选择您要显示的打印机。

在这里,使用 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"))

在枚举打印机之前,您应该验证 Spooler 服务是否实际可用。您可以使用ServiceController 类检查spooler 服务的Status 属性,看看它是否为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 函数或对应WMI 的Win32_PrinterSetDefaultPrinter 方法。

► 点击按钮设置新的默认打印机时,使用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

【讨论】:

  • 完美!这使我的脚本功能如我所愿!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多