基于.NET Framework 4.7用C#获取打印机信息的问题求助
Winforms获取打印机详细信息解决方案
解决IsPrinting返回false的问题
你的第一段代码存在两个核心问题:
- 变量名
MachineName混淆了概念,PrintQueue构造函数的第二个参数需要传入打印机名称,而非机器名称。你需要替换成目标打印机的实际名称(可在「控制面板-设备和打印机」中查看)。 - 默认初始化
PrintQueue时未指定足够的访问权限,导致无法获取实时打印机状态。创建PrintQueue时需指定PrintSystemDesiredAccess.ReadPrinter权限。
修正后的代码:
// 替换为实际打印机名称 string printerName = "目标打印机名称"; LocalPrintServer localPrintServer = new LocalPrintServer(); // 指定读取权限创建PrintQueue PrintQueue pq = new PrintQueue(localPrintServer, printerName, PrintSystemDesiredAccess.ReadPrinter); pq.Refresh(); MessageBox.Show(pq.IsPrinting.ToString());
解决“Win32 Access Denied”权限错误
第二段代码的问题在于使用了PrintSystemDesiredAccess.UsePrinter权限,但仅查看打印机信息和打印任务时,ReadPrinter权限已足够,且能避免不必要的权限触发。另外:
- 若访问本地打印机,建议右键程序选择「以管理员身份运行」;
- 若访问网络打印机,需确保当前用户有权限读取该共享打印机的信息。
修正后的代码:
string printerName = "目标打印机名称"; using (var ps = new PrintServer()) { // 使用读取权限替代操作权限 using (var pq = new PrintQueue(ps, printerName, PrintSystemDesiredAccess.ReadPrinter)) { foreach (var job in pq.GetPrintJobInfoCollection()) { MessageBox.Show($"任务名称:{job.Name},状态:{job.JobStatus}"); } } }
额外提示
- 若要获取纸张规格、端口配置等更详细的打印机信息,可访问
PrintQueue.PropertiesCollection,同样需确保拥有对应访问权限; - 网络打印机需确认共享设置正常,且当前用户能访问该共享资源。
内容的提问来源于stack exchange,提问作者محمد السروجي
相关产品推荐
相关产品推荐

