2016-04-07 15 views
2

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; 
} 

cevap

1

Ben aynı sorunu var. Microsoft için destek olayı oluşturdum ve OS'de bir hata olduğunu onayladılar.

İlgili konular