सी # कोड:
public static class PrinterIcons
{
public static Dictionary<string, Icon> GetPrintersWithIcons(IntPtr hwndOwner)
{
Dictionary<string, Icon> result = new Dictionary<string, Icon>();
Shell32.IShellFolder iDesktopFolder = Shell32.GetDesktopFolder();
try
{
IntPtr pidlPrintersFolder;
if (Shell32.SHGetFolderLocation(hwndOwner, (int)Shell32.CSIDL.CSIDL_PRINTERS, IntPtr.Zero, 0, out pidlPrintersFolder) == 0)
try
{
StringBuilder strDisplay = new StringBuilder(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 ptrString;
while (iEnumIDList.Next(1, rgelt, out pceltFetched) == 0 && pceltFetched == 1)
{
printersShellFolder.GetDisplayNameOf(rgelt[0],
Shell32.ESHGDN.SHGDN_NORMAL, out ptrString);
if (Shell32.StrRetToBuf(ref ptrString, rgelt[0], strDisplay,
(uint)strDisplay.Capacity) == 0)
{
pidlPrinter = Shell32.ILCombine(pidlPrintersFolder, rgelt[0]);
string printerDisplayNameInPrintersFolder = strDisplay.ToString();
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;
}
}
खबरदार, परिणाम शब्दकोश में है कि प्रिंटर नाम प्रिंटर नाम प्रिंटर शेल फ़ोल्डर में दिखाया जाएगा, और वे प्रिंटर नाम का इस्तेमाल किया उससे भिन्न हो सकता प्रिंटरसेटिंग क्लास में (उदाहरण के लिए, प्रिंटर शेल फ़ोल्डर में नेटवर्क प्रिंटर को "चालू" के रूप में दिखाया जा सकता है, और "ऑन" शब्द विंडोज स्थानीयकरण से निर्भर करता है और मशीन नेटवर्क नाम नहीं हो सकता है)। मुझे अभी तक पता नहीं है कि IShellFolder से "असली" प्रिंटर नाम कैसे प्राप्त करें, इसे स्टैंडअर्ट प्रिंटर सेटिंग्स श्रेणी के साथ उपयोग करें।
वैसे भी, यह कोड प्रिंटर सिस्टम आइकन लोड करता है, ताकि आप इसे अपने कार्य के लिए उपयोग कर सकें।
Upd: Shell32 वर्ग कोड, इस कोड में इस्तेमाल यहां पाया जा सकता (भी जवाब के लिए बड़ा): http://pastebin.com/thJuWx45
यह समाधान एक अच्छी शुरुआत हो रहा है, तो आप पी/आह्वान के साथ खेल शुरू कर सकते हैं: http: //stackoverflow.com/questions/1063874/winapi-retrieving-icons-of-current-user-printers –