Puis-je obtenir l’icône associée à une imprimante installée via .Net?

Je sais comment obtenir la liste de toutes les imprimantes installées sur une machine avec .Net:

foreach (Ssortingng printer in PrinterSettings.InstalledPrinters) { Console.WriteLine(printer.ToSsortingng()); } Console.ReadLine(); 

InstalledPrinters n’est qu’une liste de chaînes. Existe-t-il un moyen d’obtenir les objects d’imprimante installés contenant à la fois le nom et l’image que je verrais normalement sous “Périphériques et imprimantes” dans l’Explorateur Windows?

L’icône est normalement intégrée dans l’un des fichiers dll ou le fichier EXE principal, regardez les méthodes statiques System.Drawing.Icon, le lien ci-dessous est pour WinForms, c’est légèrement différent avec WPF car vous devez créer un ImageSource à partir de l’extraction. stream d’icons.

Comment: extraire l’icône associée à un fichier dans Windows Forms

Code C # pour cette tâche:

 public static class PrinterIcons { public static Dictionary GetPrintersWithIcons(IntPtr hwndOwner) { Dictionary result = new Dictionary(); Shell32.IShellFolder iDesktopFolder = Shell32.GetDesktopFolder(); try { IntPtr pidlPrintersFolder; if (Shell32.SHGetFolderLocation(hwndOwner, (int)Shell32.CSIDL.CSIDL_PRINTERS, IntPtr.Zero, 0, out pidlPrintersFolder) == 0) try { SsortingngBuilder strDisplay = new SsortingngBuilder(260); Guid guidIShellFolder = Shell32.IID_IShellFolder; IntPtr ptrPrintersShellFolder; iDesktopFolder.BindToObject(pidlPrintersFolder, IntPtr.Zero, ref guidIShellFolder, out ptrPrintersShellFolder); Object objPrintersShellFolder = Marshal.GetTypedObjectForIUnknown(ptrPrintersShellFolder, Shell32.ShellFolderType); try { Shell32.IShellFolder printersShellFolder = (Shell32.IShellFolder)objPrintersShellFolder; IntPtr ptrObjectsList; printersShellFolder.EnumObjects(hwndOwner, Shell32.ESHCONTF.SHCONTF_NONFOLDERS, out ptrObjectsList); Object objEnumIDList = Marshal.GetTypedObjectForIUnknown(ptrObjectsList, Shell32.EnumIDListType); try { Shell32.IEnumIDList iEnumIDList = (Shell32.IEnumIDList)objEnumIDList; IntPtr[] rgelt = new IntPtr[1]; IntPtr pidlPrinter; int pceltFetched; Shell32.STRRET ptrSsortingng; while (iEnumIDList.Next(1, rgelt, out pceltFetched) == 0 && pceltFetched == 1) { printersShellFolder.GetDisplayNameOf(rgelt[0], Shell32.ESHGDN.SHGDN_NORMAL, out ptrSsortingng); if (Shell32.StrRetToBuf(ref ptrSsortingng, rgelt[0], strDisplay, (uint)strDisplay.Capacity) == 0) { pidlPrinter = Shell32.ILCombine(pidlPrintersFolder, rgelt[0]); ssortingng printerDisplayNameInPrintersFolder = strDisplay.ToSsortingng(); Shell32.SHFILEINFO shinfo = new Shell32.SHFILEINFO(); Shell32.SHGetFileInfo(pidlPrinter, 0, out shinfo, (uint)Marshal.SizeOf(shinfo), Shell32.SHGFI.PIDL | Shell32.SHGFI.AddOverlays | Shell32.SHGFI.Icon); Icon printerIcon = (Icon)Icon.FromHandle(shinfo.hIcon).Clone(); Shell32.DestroyIcon(shinfo.hIcon); result.Add(printerDisplayNameInPrintersFolder, printerIcon); } } } finally { Marshal.ReleaseComObject(objEnumIDList); } } finally { Marshal.ReleaseComObject(objPrintersShellFolder); } } finally { Shell32.ILFree(pidlPrintersFolder); } } finally { Marshal.ReleaseComObject(iDesktopFolder); } return result; } } 

Attention, les noms d’imprimante dans le dictionnaire de résultats seront des noms d’imprimantes affichés dans le dossier shell Printers, et ils peuvent être différents des noms d’imprimante utilisés dans la classe PrinterSettings (par exemple, les imprimantes réseau du dossier Printers peuvent être affichées). le mot “on” dépend de la localisation de Windows et peut ne pas être le nom du réseau de la machine). Je ne sais pas encore comment obtenir un “vrai” nom d’imprimante à partir d’IShellFolder pour l’utiliser avec la classe PrinterSettings standard.

Quoi qu’il en soit, ce code charge les icons du système d’imprimante, vous pouvez donc l’utiliser pour vos tâches.

Upd: Le code de la classe Shell32, utilisé dans ce code, peut être trouvé ici (trop gros pour une réponse): http://pastebin.com/thJuWx45