在C#开发中,设置系统默认打印机是一个比较常见的需求,尤其是在需要自动适配打印设备的桌面应用场景里。下面我们先来看实现这个功能的核心思路,再给出完整的代码示例。

实现思路说明
C#本身没有直接设置默认打印机的原生方法,需要借助Windows系统的API函数SetDefaultPrinter来实现,这个函数位于winspool.drv动态库中。我们只要通过平台调用(P/Invoke)的方式引入这个函数,再传入目标打印机的名称,就可以完成默认打印机的设置。
完整代码示例
下面的代码包含了引入API、获取当前打印机列表、设置默认打印机的完整逻辑,你可以直接复制到项目中使用:
using System;
using System.Drawing.Printing;
using System.Runtime.InteropServices;
namespace PrinterDemo
{
class PrinterHelper
{
// 引入Windows设置默认打印机的API
[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool SetDefaultPrinter(string printerName);
/// <summary>
/// 获取系统中所有已安装的打印机名称
/// </summary>
/// <returns>打印机名称数组</returns>
public static string[] GetAllPrinters()
{
// 使用PrinterSettings类的InstalledPrinters属性获取已安装打印机
PrinterSettings settings = new PrinterSettings();
string[] printers = new string[PrinterSettings.InstalledPrinters.Count];
PrinterSettings.InstalledPrinters.CopyTo(printers, 0);
return printers;
}
/// <summary>
/// 设置指定名称为系统默认打印机
/// </summary>
/// <param name="printerName">目标打印机名称</param>
/// <returns>设置是否成功</returns>
public static bool SetPrinterAsDefault(string printerName)
{
if (string.IsNullOrEmpty(printerName))
{
throw new ArgumentException("打印机名称不能为空");
}
// 调用API设置默认打印机
return SetDefaultPrinter(printerName);
}
}
class Program
{
static void Main(string[] args)
{
try
{
// 先获取所有已安装的打印机
string[] allPrinters = PrinterHelper.GetAllPrinters();
Console.WriteLine("当前系统已安装的打印机:");
foreach (string printer in allPrinters)
{
Console.WriteLine(printer);
}
// 假设要设置名为"Microsoft Print to PDF"的打印机为默认,实际使用时替换为目标打印机名称
string targetPrinter = "Microsoft Print to PDF";
bool result = PrinterHelper.SetPrinterAsDefault(targetPrinter);
if (result)
{
Console.WriteLine($"成功将{targetPrinter}设置为默认打印机");
}
else
{
Console.WriteLine($"设置{targetPrinter}为默认打印机失败");
}
}
catch (Exception ex)
{
Console.WriteLine($"操作出现异常:{ex.Message}");
}
}
}
}注意事项
- 设置默认打印机需要应用具有足够的系统权限,如果是普通用户权限,部分场景下可能无法修改系统级的打印机配置,建议以管理员身份运行程序。
- 传入的打印机名称必须和系统中已安装的打印机名称完全一致,包括大小写,否则设置会失败,可以先调用
GetAllPrinters方法确认目标打印机是否存在。 - 如果是在服务类程序中使用这个功能,需要注意服务运行的账户权限,避免因为权限不足导致设置失败。
常见问题说明
如果调用SetDefaultPrinter返回false,可以通过Marshal.GetLastWin32Error()获取具体的错误码,再根据错误码排查问题,比如错误码5表示权限不足,错误码87表示参数错误。
另外,如果你只是在当前应用中临时使用某个打印机打印,不需要修改系统默认打印机,也可以直接设置PrintDocument的PrinterSettings.PrinterName属性,指定本次打印使用的打印机即可,这种方式不会影响系统的全局默认打印机配置。
C#默认打印机PrintDocument系统设置代码示例修改时间:2026-05-29 03:55:10