Comment obtenir le nom de l’imprimante à partir du périphérique et des imprimantes IShellFolder?

Je reçois des icons d’imprimantes système à l’aide de code (le seul moyen que j’ai trouvé – d’utiliser IShellFolder), je souhaite maintenant les connecter à InstalledPrinters. Nom_serveur \ nom_imprimante “), est différent du nom d’affichage du contenu du dossier shell” Périphériques et imprimantes “et ne peut être utilisé qu’avec PrinterSettings.

Le code que j’ai utilisé pour récupérer les icons d’imprimante et les légendes d’imprimante dans le dossier shell “Périphériques et imprimantes”:

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 printerDisplayName = strDisplay.ToSsortingng(); Shell32.SHFILEINFO shinfo = new Shell32.SHFILEINFO(); Shell32.SHGetFileInfo(this._pidl, 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); // HOW TO GET PRINTER NAME (\\ServerName\printername) WITH IS DIFFERENT FROM A PRINTER NAME IN "DEVICES AND PRINTERS" SYSTEM FOLDER } } } finally { Marshal.ReleaseComObject(objEnumIDList); } } finally { Marshal.ReleaseComObject(objPrintersShellFolder); } } finally { Shell32.ILFree(pidlPrintersFolder); } } finally { Marshal.ReleaseComObject(iDesktopFolder); } 

Merci pour toute aide.

Trouvez la réponse par moi-même.

Pour énumérer les imprimantes dans IShellFolder, nous devons utiliser la méthode IShellFolder.ParseDisplayName, et non EnumObjects, et envoyer le nom de l’imprimante à partir PrinterSettings.IntalledPrinters (tel que “\ NomServeur \ NomImprimante” pour les imprimantes réseau) à IShellFolder.ParseDisplayName param psd, mis en valeur. travailler avec ce bien.

Ainsi, après cela, nous pouvons énumérer les noms d’imprimante réels (“\ NomServeur \ NomImprimante”), les noms d’affichage d’imprimante (“NomImprimante sur NomServeur” en tant qu’imprimantes répertoriées dans “Périphériques et imprimantes”) et les icons d’imprimante.

Je posterai le code complet ici pour la recherche de père après quelques modifications.

Dans la boucle, vous pouvez utiliser printersShellFolder.GetUIObjectOf pour IID_IDataObject sur la rgelt[0] actuelle et appeler IDataObject::GetData avec "PrinterFriendlyName" comme format de Presse-papiers pour obtenir le nom réel de l’imprimante (codé dans STGMEDIUM ).

Vous pouvez également utiliser printersShellFolder.GetUIObjectOf pour IID_IQueryInfo sur le pidl actuel pour obtenir le statut de l’imprimante.