.NET で表示されているすべてのネットワーク プリンターを列挙する簡単な方法はありますか? 現在、ユーザーがプリンターを選択できるように PrintDialog を表示しています。問題は、ローカル プリンターも (XPS Document Writer などと共に) 表示されることです。自分でネットワーク プリンターを列挙できれば、それらのプリンターだけを含むカスタム ダイアログを表示できます。
ありがとう!!
.NET で表示されているすべてのネットワーク プリンターを列挙する簡単な方法はありますか? 現在、ユーザーがプリンターを選択できるように PrintDialog を表示しています。問題は、ローカル プリンターも (XPS Document Writer などと共に) 表示されることです。自分でネットワーク プリンターを列挙できれば、それらのプリンターだけを含むカスタム ダイアログを表示できます。
ありがとう!!
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);
新しい 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);
}
}
ここでこのコードを見つけました
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
PrinterSettiings.InstalledPrinters
必要なコレクションを提供する必要があります
これに関連する別の投稿 ( 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# プロジェクト