请问如何枚举出网络打印机?不是本地的哦。
最好能给出相关代码,谢谢!

解决方案 »

  1.   

    参考msdn中的PrinterSettings.InstalledPrinters属性另外,参考:
    http://www.ddvip.net/program/c-/index5/18.htm
      

  2.   

    PrinterSettings.InstalledPrinters只能枚举出本地安装的打印机。
    楼主要的是网络打印机,呵呵~~~
      

  3.   

    sorry:
    参考:
    http://www.njpro.cn/494/ShowPost.aspx
      

  4.   

    TO:jiezhi(风满袖)
    http://www.njpro.cn/494/ShowPost.aspx
    ------------------------------------------------------------------    pInfo.Name = Marshal.PtrToStringAuto(pi.pName);
        pInfo.Description = Marshal.PtrToStringAuto(pi.pDescription);
        pInfo.Comment = Marshal.PtrToStringAuto(pi.pComment);    这三个属性找不到。
      

  5.   

    看一下這個貼子:
    http://community.csdn.net/Expert/topic/4331/4331547.xml?temp=.589245
      

  6.   

    [DllImport("winspool.drv", CharSet=CharSet.Auto)]

    static extern bool EnumPrinters(int flags, string name, int level, IntPtr pPrinterEnum,
    int cbBuf, out int pcbNeeded, out int pcReturned);
      

  7.   

    [DllImport("winspool.drv", CharSet=CharSet.Auto)]
    static extern bool EnumPrinters(int flags, string name, int level, IntPtr pPrinterEnum,int cbBuf, out int pcbNeeded, out int pcReturned);
      

  8.   

    Imports System.DirectoryServices
    Imports System.Management
    Public Class HowToSearchPrinter    Public Shared Function NetPrinters(ByVal GetWay As GetComputer) As String()
            Dim mResult(-1) As String
            Dim mPrinterFormat As String = "Computer:{0} Printer:{1}"
            Dim mNetComputerNames(-1) As String        Select Case GetWay
                Case GetComputer.Simple
                    mNetComputerNames = GetNetComputerNames()
                Case GetComputer.Ping
                    mNetComputerNames = GetNetComputerNamesByPing()
            End Select        For Each mComputer As String In mNetComputerNames
                For Each mPrinter As String In GetPrinterName(mComputer)
                    ReDim Preserve mResult(mResult.Length)
                    mResult(mResult.Length - 1) = String.Format(mPrinterFormat, mComputer, mPrinter)
                Next
            Next        Return mResult
        End Function    '这里不保证得到所有的计算机
        Private Shared Function GetNetComputerNames() As String()
            Dim mResult(-1) As String        Dim root As DirectoryEntry = New DirectoryEntry("WinNT:")
            For Each Domain As DirectoryEntry In root.Children
                '枚举工作组或域 
                For Each Computer As DirectoryEntry In Domain.Children
                    '枚举指定工作组或域的计算机 
                    If Computer.SchemaClassName.Equals("Computer") Then
                        ReDim Preserve mResult(mResult.Length)
                        mResult(mResult.Length - 1) = Computer.Name
                    End If
                Next
            Next
            Return mResult
        End Function    '这倒是可以得到所有的计算机,可是也太慢了
        Private Shared Function GetNetComputerNamesByPing() As String()
            If Not My.Computer.Network.IsAvailable Then Return Nothing
            Dim Result(-1) As String
            Dim PingFormat As String = "192.168.0.{0}"
            For i As Integer = 1 To 254
                If My.Computer.Network.Ping(String.Format(PingFormat, i), 100) Then
                    ReDim Preserve Result(Result.Length)
                    Result(Result.Length - 1) = Net.Dns.GetHostEntry(String.Format(PingFormat, i)).HostName '这个方法是Net2.0
                End If
            Next
            Return Result
        End Function    Private Shared Function GetPrinterName(ByVal computerName As String) As String()
            Dim mResult(-1) As String        Dim o As New ManagementObject
            o.Scope = New ManagementScope(String.Format("\\{0}\root\cimv2", computerName))
            Dim mSearch As New ManagementObjectSearcher(String.Format("SELECT DeviceID FROM {0}", "Win32_Printer"))
            mSearch.Scope = o.Scope
            Try
                For Each mManagementObject As ManagementObject In mSearch.Get()
                    ReDim Preserve mResult(mResult.Length)
                    mResult(mResult.Length - 1) = System.Text.RegularExpressions.Regex.Replace(mManagementObject.ToString, ".*""(.*)""", "${1}")
                Next
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            Finally
                mSearch.Dispose()
                o.Dispose()
            End Try        Return mResult
        End Function    Public Enum GetComputer
            Simple
            Ping
        End Enum
    End Class测试:
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            For Each s As String In HowToSearchPrinter.NetPrinters(HowToSearchPrinter.GetComputer.Simple)
                Console.WriteLine(s)
            Next
        End Sub
    结果:
    Computer:FK-A05-01 Printer:hp LaserJet 1000 DOS
    Computer:FK-A05-01 Printer:hp LaserJet 1000 (副本 3)
    Computer:FK-A05-01 Printer:hp LaserJet 1000
    Computer:FK-A05-01 Printer:EPSON AL-C8600 Advanced
    Computer:FK-A09-05 Printer:在 PK 上自动 Canon LBP-810
    Computer:FK-A09-05 Printer:OKi5530结算单
    Computer:FK-A09-05 Printer:OKi5530
    Computer:FK-A09-05 Printer:Microsoft Office Document Image Writer
    Computer:FK-A09-05 Printer:EPSON LQ-1600KIII
    Computer:PK Printer:Tencent Virtual Printer
    Computer:PK Printer:Canon LBP-810