.Net Core 连接到 Windows 打印机
.Net Core connect to a Windows Printer
NET 6 和 F#。硬件交互是一个新领域!
我正在尝试连接安装在 Windows 上且名称为“PRINTERNAME”的打印机。我以前使用的 PHP 库可以与该名称连接,但我使用的 .NET 库不能。所以要自己尝试一下。
打印机通过 USB 连接。
连接并验证本地计算机上是否存在该打印机的最佳方法是什么?
我正在使用 F#,但这更像是一个框架问题,因为我不知道要使用什么类型的接口或库。
我在这方面没有太多经验,但我认为没有任何方法可以在 .NET 中“连接”到打印机而不实际打印某些东西。
您可以做的一件事是枚举系统上安装的打印机:
open System.Drawing.Printing // Nuget package: System.Drawing.Common
for printer in PrinterSettings.InstalledPrinters do
printfn "%s" printer
PrinterSettings
class 的 documentation 可能有更多对您有用的信息。
注意:这只是Windows。
我看到其他答案可以帮助您枚举 现有打印机 - 但它们不能帮助您添加新打印机.
抱歉,我没有适合您的 F# 答案。但是,我有一个 C# 答案,您可以将其转换为 F#。 (抱歉,我的 F# 知识还不够好,不知道该怎么做!)
正常的"Add Printer" dialog (image)由函数PrintUIEntry
中的DLLprintui.dll
处理。您可以通过在命令提示符处执行 rundll32 printui.dll,PrintUIEntry /il
来手动 运行 此功能。 (运行 命令 rundll32 printui.dll,PrintUIEntry
查看帮助对话框)
现在 - 你如何从 code 做到这一点?虽然您当然可以调用 System.Diagnostics.Process.Start()
,使用适当的参数调用 rundll32 printui.dll,PrintUIEntry
,但您也可以使用 P/Invoke 互操作。
...不幸的是,至少根据 pinvoke.net 看来,P/Invoke 互操作调用实际上只不过是做同一件事的不同方式。
示例代码(再次抱歉,C#)
using System;
using System.Runtime.InteropServices;
[DllImport("printui.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern void PrintUIEntryW(IntPtr hwnd, IntPtr hinst, string lpszCmdLine, int nCmdShow);
public static void ConnectToSharedPrinter(
string uncPath,
string? driverFile,
bool setAsDefault
)
{
uncPath = uncPath ?? throw new ArgumentNullException(nameof(uncPath));
var command = $"/n {uncPath}";
if(setAsDefault)
command = command + " /y";
command = driverFile is null
? command + " /id"
: command + $" /if /f ""{driverFile}""";
PrintUIEntryW(IntPtr.Zero, IntPtr.Zero, ", command, 0);
}
NET 6 和 F#。硬件交互是一个新领域!
我正在尝试连接安装在 Windows 上且名称为“PRINTERNAME”的打印机。我以前使用的 PHP 库可以与该名称连接,但我使用的 .NET 库不能。所以要自己尝试一下。
打印机通过 USB 连接。
连接并验证本地计算机上是否存在该打印机的最佳方法是什么?
我正在使用 F#,但这更像是一个框架问题,因为我不知道要使用什么类型的接口或库。
我在这方面没有太多经验,但我认为没有任何方法可以在 .NET 中“连接”到打印机而不实际打印某些东西。
您可以做的一件事是枚举系统上安装的打印机:
open System.Drawing.Printing // Nuget package: System.Drawing.Common
for printer in PrinterSettings.InstalledPrinters do
printfn "%s" printer
PrinterSettings
class 的 documentation 可能有更多对您有用的信息。
注意:这只是Windows。
我看到其他答案可以帮助您枚举 现有打印机 - 但它们不能帮助您添加新打印机.
抱歉,我没有适合您的 F# 答案。但是,我有一个 C# 答案,您可以将其转换为 F#。 (抱歉,我的 F# 知识还不够好,不知道该怎么做!)
正常的"Add Printer" dialog (image)由函数PrintUIEntry
中的DLLprintui.dll
处理。您可以通过在命令提示符处执行 rundll32 printui.dll,PrintUIEntry /il
来手动 运行 此功能。 (运行 命令 rundll32 printui.dll,PrintUIEntry
查看帮助对话框)
现在 - 你如何从 code 做到这一点?虽然您当然可以调用 System.Diagnostics.Process.Start()
,使用适当的参数调用 rundll32 printui.dll,PrintUIEntry
,但您也可以使用 P/Invoke 互操作。
...不幸的是,至少根据 pinvoke.net 看来,P/Invoke 互操作调用实际上只不过是做同一件事的不同方式。
示例代码(再次抱歉,C#)
using System;
using System.Runtime.InteropServices;
[DllImport("printui.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern void PrintUIEntryW(IntPtr hwnd, IntPtr hinst, string lpszCmdLine, int nCmdShow);
public static void ConnectToSharedPrinter(
string uncPath,
string? driverFile,
bool setAsDefault
)
{
uncPath = uncPath ?? throw new ArgumentNullException(nameof(uncPath));
var command = $"/n {uncPath}";
if(setAsDefault)
command = command + " /y";
command = driverFile is null
? command + " /id"
: command + $" /if /f ""{driverFile}""";
PrintUIEntryW(IntPtr.Zero, IntPtr.Zero, ", command, 0);
}