13

.NET で表示されているすべてのネットワーク プリンターを列挙する簡単な方法はありますか? 現在、ユーザーがプリンターを選択できるように PrintDialog を表示しています。問題は、ローカル プリンターも (XPS Document Writer などと共に) 表示されることです。自分でネットワーク プリンターを列挙できれば、それらのプリンターだけを含むカスタム ダイアログを表示できます。

ありがとう!!

4

6 に答える 6

16
  • からデフォルトのプリンターを取得します。LocalPrintServer.DefaultPrintQueue
  • インストールされているプリンターを (ユーザーの観点から) から取得します。PrinterSettings.InstalledPrinters
  • リストを列挙します。
  • で始まるプリンター\\はすべてネットワーク プリンターです。new PrintServer("\\UNCPATH").GetPrintQueue("QueueName")
  • で始まらないプリンターはすべて\\ローカル プリンターなので、LocalPrintServer.GetQueue("Name")
  • プロパティを比較すると、どちらがデフォルトであるかがわかりFullNameます。

注: ネットワーク プリンタは のデフォルト プリンタにすることができますが、LocalPrintServer.DefaultPrintQueueには表示されません。LocalPrintServer.GetPrintQueues()

    // get available printers
    LocalPrintServer printServer = new LocalPrintServer();
    PrintQueue defaultPrintQueue = printServer.DefaultPrintQueue;

    // get all printers installed (from the users perspective)he t
    var printerNames = PrinterSettings.InstalledPrinters;
    var availablePrinters = printerNames.Cast<string>().Select(printerName => 
    {
        var match = Regex.Match(printerName, @"(?<machine>\\\\.*?)\\(?<queue>.*)");
        PrintQueue queue;
        if (match.Success)
        {
            queue = new PrintServer(match.Groups["machine"].Value).GetPrintQueue(match.Groups["queue"].Value);
        }
        else
        {
            queue = printServer.GetPrintQueue(printerName);
        }

        var capabilities = queue.GetPrintCapabilities();
        return new AvailablePrinterInfo()
        {
            Name = printerName,
            Default = queue.FullName == defaultPrintQueue.FullName,
            Duplex = capabilities.DuplexingCapability.Contains(Duplexing.TwoSidedLongEdge),
            Color = capabilities.OutputColorCapability.Contains(OutputColor.Color)
        };
    }).ToArray();

    DefaultPrinter = AvailablePrinters.SingleOrDefault(x => x.Default);
于 2011-08-31T09:13:53.497 に答える
15

新しい System.Printing API の使用

using (var printServer = new PrintServer(string.Format(@"\\{0}", PrinterServerName)))
{
    foreach (var queue in printServer.GetPrintQueues())
    {
        if (!queue.IsShared)
        {
            continue;
        }
        Debug.WriteLine(queue.Name);
     }
 }
于 2009-08-19T05:34:03.450 に答える
9

ここでこのコードを見つけました

 private void btnGetPrinters_Click(object sender, EventArgs e)
        {
// Use the ObjectQuery to get the list of configured printers
            System.Management.ObjectQuery oquery =
                new System.Management.ObjectQuery("SELECT * FROM Win32_Printer");

            System.Management.ManagementObjectSearcher mosearcher =
                new System.Management.ManagementObjectSearcher(oquery);

            System.Management.ManagementObjectCollection moc = mosearcher.Get();

            foreach (ManagementObject mo in moc)
            {
                System.Management.PropertyDataCollection pdc = mo.Properties;
                foreach (System.Management.PropertyData pd in pdc)
                {
                    if ((bool)mo["Network"])
                    {
                        cmbPrinters.Items.Add(mo[pd.Name]);
                    }
                }
            }

        }

アップデート:

「この API 関数は、サーバー、ワークステーション、プリンター、共有、リモート ディレクトリなどを含むすべてのネットワーク リソースを列挙できます。」

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=741&lngWId=10

于 2009-06-19T13:49:10.643 に答える
2

PrinterSettiings.InstalledPrinters必要なコレクションを提供する必要があります

于 2009-06-19T13:44:59.280 に答える
2

これに関連する別の投稿 ( https://stackoverflow.com/a/30758129/6513653 ) で、Scott Chamberlain は次のように述べています。 "。可能なすべての .NET リソースを試してみた結果、彼は正しいと思います。そこで、ADD PRINTER ダイアログがどのように検索を行うかを調査し始めました。Wireshark を使用して、ADD PRINTER が少なくとも 2 種類のパッケージをローカル ネットワーク内のすべてのホストに送信することを発見しました。3911 ポートへの 2 つの http/xml 要求と 3 つの SNMP 要求です。ここに画像の説明を入力 最初の SNMP 要求は、プリンター MIB である get-next 1.3.6.1.2.1.43 です。2 つ目は、PRINTER-PORT-MONITOR-MIB の pmPrinterIEEE1284DeviceId である get 1.3.6.1.4.1.2699.1.2.1.2.1.1.3 です。これは、ADD PRINTER がプリンター名を取得する場所であるため、最も興味深いものです。3 番目は、SNMP MIB-2 システムの sysDescr である get 1.3.6.1.2.1.1.1.0 です。ローカル ネットワーク内のほとんどのネットワーク プリンターを見つけるには、2 番目の SNMP 要求で十分だと思うので、このコードを実行しました。Windows フォーム アプリケーションで機能し、SnmpSharpNet に依存します。

編集: ネットワーク内のアクティブなホストを検索するために、通常の Ping の代わりに ARP Ping を使用しています。サンプル プロジェクトへのリンク: ListNetworks C# プロジェクト

于 2016-11-13T00:34:50.357 に答える