2011-01-13 14 views
5

मुझे पता है कि नेट के साथ एक मशीन पर स्थापित प्रिंटर के सभी की सूची प्राप्त करने:क्या मैं स्थापित प्रिंटर से जुड़े आइकन को नेट के माध्यम से प्राप्त कर सकता हूं?

foreach (String printer in PrinterSettings.InstalledPrinters) 
{   
    Console.WriteLine(printer.ToString()); 
} 
Console.ReadLine(); 

InstalledPrinters सिर्फ स्ट्रिंग की एक सूची है, हालांकि है। क्या स्थापित प्रिंटर ऑब्जेक्ट्स प्राप्त करने का कोई तरीका है जिसमें नाम और आइकन छवि दोनों शामिल हैं जिन्हें मैं सामान्य रूप से विंडोज एक्सप्लोरर में "डिवाइस और प्रिंटर" के अंतर्गत देखता हूं?

+0

यह समाधान एक अच्छी शुरुआत हो रहा है, तो आप पी/आह्वान के साथ खेल शुरू कर सकते हैं: http: //stackoverflow.com/questions/1063874/winapi-retrieving-icons-of-current-user-printers –

उत्तर

2

आइकन आम तौर पर किसी भी डीएलएल फाइलों या मुख्य EXE में एम्बेड किया जाता है, सिस्टम को देखें। ड्रॉइंग। आइकन स्थिर विधियां, नीचे दिया गया लिंक WinForms के लिए है, यह WPF के साथ थोड़ा अलग है क्योंकि आपको बनाना है निकाले गए आइकन स्ट्रीम से ImageSource। इस कार्य के लिए

How to: Extract the Icon Associated with a File in Windows Forms

+0

लेकिन, प्रिंटर के आइकन के लिए आप कौन सा * .dll पूछेंगे? मैंने System.Printing.dll से पूछताछ करने का प्रयास किया है जिसके लिए यह डीएलएल का प्रतीक देता है। प्रिंटर नहीं। –

+0

विंडोज़ \ System32 निर्देशिका में DDORes.dll देखने के लिए डीएलएल है। –

0

सी # कोड:

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

+0

आईशेलफ़ोल्डर में प्रिंटर की गणना करने के लिए बेहतर तरीके से उपयोग करें IhellFolder.ParseDisplayName विधि, EnumObjects नहीं, और प्रिंटरसेटिंग से प्रिंटर नाम भेजें। IntalledPrinters (जैसे नेटवर्क प्रिंटर के लिए "\ सर्वर नाम \ प्रिंटरनाम") IShellFolder.ParseDisplayName param pszDisplayName, IShellFolder "डिवाइस और प्रिंटर" इस अच्छी तरह से काम करो। तो, इसके बाद हम वास्तविक प्रिंटर नाम ("\ सर्वर नाम \ प्रिंटरनाम") का आकलन कर सकते हैं, प्रिंटर डिस्प्ले नाम ("सर्वर नाम पर प्रिंटरनाम" "डिवाइस और प्रिंटर" में सूचीबद्ध प्रिंटर के रूप में) और प्रिंटर आइकन। –

संबंधित मुद्दे

 संबंधित मुद्दे