gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:48:20 24 4
gpt4 key购买 nike

我正在尝试以编程方式从 Windows 中删除打印机条目,它似乎适用于 TCP/IP 打印机,但不适用于分配给 USB 端口的打印机。实际上,打印机条目从 Win32_Printer WMI 集合中消失,但它仍然存在于“控制面板 - 设备和打印机”中。它只有名称,没有驱动程序和分配的其他信息。我试图通过 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 创建了支持事件,他们确认这是操作系统中的错误。

关于c# - 无法通过 Windows 8.1 和 Windows 10 上的 Win32 API 从控制面板删除打印机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36473829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com