无法通过 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.
中的错误
我正在尝试以编程方式从 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.
中的错误