Yazıcı girdisini Windows'tan programlı olarak silmeye çalışıyorum ve TCP/IP yazıcılarıyla çalıştığı ancak USB bağlantı noktasına atanmış gibi görünüyor. Aslında, yazıcı girdisi Win32_Printer WMI koleksiyonundan kayboluyor, ancak yine de "Denetim Masası - Aygıtlar ve Yazıcılar" da var. Orada sürücü olmadan sadece isim var ve ek bilgi atandı. Bunu ManagementScope ve "DeletePrinter" Yazdırma Biriktiricisi API'si yöntemi ile yapmaya çalışıyorum. Benim kod parçalarını:Yazıcı, Windows 8.1 ve Windows 10 üzerinde Win32 API aracılığıyla kontrol panelinden silinemiyor
ManagementScope:
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();
DeletePrinter:
[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;
}