2012-11-05 20 views
5

w C# Chciałbym uzyskać listę wszystkich sterowników drukarek zainstalowanych w systemie działa Pobierz, jak Windows "add printer" wizard:listę wszystkich dostępnych sterowników drukarki (jak Kreator dodawania drukarki)

byłem w stanie wymienić już zainstalowane drukarki, ale jak wyświetlić listę sterowników dostępnych w systemie?

+0

Ten kreator nie * nie * lista zainstalowanych sterowników drukarek, zawiera sterowniki, które mogłyby * * być zainstalowane. Ten rodzaj funkcji jest ukryty w interfejsie API konfiguracji. Bardzo trudne w użyciu .NET, pinvoke jest nieprzyjemny. I nie jest * prostym API do ogólnego zastosowania. http://msdn.microsoft.com/en-us/library/windows/hardware/ff553567%28v=vs.85%29.aspx –

+0

Dziękuję bardzo za odpowiedź. Myślę, że wolałbym uniknąć ... –

Odpowiedz

0

Ten kod wylicza zainstalowane sterowniki drukarki:

public struct DRIVER_INFO_2 
{ 
    public uint cVersion; 
    [MarshalAs(UnmanagedType.LPTStr)] public string pName; 
    [MarshalAs(UnmanagedType.LPTStr)] public string pEnvironment; 
    [MarshalAs(UnmanagedType.LPTStr)] public string pDriverPath; 
    [MarshalAs(UnmanagedType.LPTStr)] public string pDataFile; 
    [MarshalAs(UnmanagedType.LPTStr)] public string pConfigFile; 
} 


public static class EnumeratePrinterDriverNames 
{ 
    [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern int EnumPrinterDrivers(String pName, String pEnvironment, uint level, IntPtr pDriverInfo, 
     uint cdBuf, ref uint pcbNeeded, ref uint pcRetruned); 

    public static IEnumerable<string> Enumerate() 
    { 
     const int ERROR_INSUFFICIENT_BUFFER = 122; 

     uint needed = 0; 
     uint returned = 0; 
     if (EnumPrinterDrivers(null, null, 2, IntPtr.Zero, 0, ref needed, ref returned) != 0) 
     { 
      //succeeds, but shouldn't, because buffer is zero (too small)! 
      throw new ApplicationException("EnumPrinters should fail!"); 
     } 

     int lastWin32Error = Marshal.GetLastWin32Error(); 
     if (lastWin32Error != ERROR_INSUFFICIENT_BUFFER) 
     { 
      throw new Win32Exception(lastWin32Error); 
     } 

     IntPtr address = Marshal.AllocHGlobal((IntPtr) needed); 
     try 
     { 
      if (EnumPrinterDrivers(null, null, 2, address, needed, ref needed, ref returned) == 0) 
      { 
       throw new Win32Exception(Marshal.GetLastWin32Error()); 
      } 

      var type = typeof (DRIVER_INFO_2); 
      IntPtr offset = address; 
      int increment = Marshal.SizeOf(type); 

      for (uint i = 0; i < returned; i++) 
      { 
       var di = (DRIVER_INFO_2) Marshal.PtrToStructure(offset, type); 
       offset += increment; 

       yield return di.pName; 
      } 
     } 
     finally 
     { 
      Marshal.FreeHGlobal(address); 
     } 
    } 
} 
Powiązane problemy