.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);
}