无法通过 Windows 8.1 和 Windows 10 上的 Win32 API 从控制面板删除打印机

Cannot delete printer from control panel via Win32 API on Windows 8.1 and Windows 10

我正在尝试以编程方式从 Windows 中删除打印机条目,它似乎适用于 TCP/IP 打印机,但不适用于分配给 USB 端口的打印机。实际上,打印机条目从 Win32_Printer WMI 集合中消失了,但它仍然存在于 "Control Panel - Devices and Printers" 中。它只有名称,没有驱动程序和分配的其他信息。 我试图通过 ManagementScope 和 "DeletePrinter" Print Spooler API 方法来做到这一点。我的代码片段:

管理范围:

ManagementScope scope = new ManagementScope(ManagementPath.DefaultPath);
scope.Connect();
SelectQuery query = new SelectQuery("select * from Win32_Printer WHERE Name LIKE '" + printerName + "'");
ManagementObjectSearcher search = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection printersCollection = search.Get();
foreach (ManagementObject printer in printersCollection)
   printer.Delete();

删除打印机:

[DllImport("winspool.drv", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
static extern bool DeletePrinter(IntPtr hPrinter);

[DllImport("winspool.drv", SetLastError = true)]
static extern int ClosePrinter(IntPtr hPrinter);

[DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
public static extern int OpenPrinter(string pPrinterName, out IntPtr phPrinter, IntPtr pDefault);

private static bool DeletePrinter(string printerName)
{
   var pd = new PRINTER_DEFAULTS { DesiredAccess = 8 | 4 | 0x000F0000 };
   var rawsize = Marshal.SizeOf(pd);
   var pdPtr = Marshal.AllocHGlobal(rawsize);
   Marshal.StructureToPtr(pd, pdPtr, true);
   IntPtr hPrinter;
   if (OpenPrinter(printerName, out hPrinter, pdPtr) != 0)
   {
      if (hPrinter != IntPtr.Zero)
      {
         var result = DeletePrinter(hPrinter);
         ClosePrinter(hPrinter);
         return result;
      }
   }
   return false;
}

我有同样的问题。 我为 Microsoft 创建了支持事件,他们确认这是 OS.

中的错误