2012-09-29 24 views
11

मैंने एक ऐसा ऐप्लिकेशन बनाया है जो आपको आपके कंप्यूटर में फ़ाइलों की एक सूची प्रस्तुत करता है। जब भी आप सूची में किसी भी आइटम पर क्लिक करते हैं, तो उसके बगल में एक छोटा पिक्चरबॉक्स संबंधित फाइल के थंबनेल को दिखाना चाहिए। मैं विंडोज 7 पर सी # का उपयोग कर रहा हूं।थंबनेल एक्सेस करना जो मौजूद नहीं है

थंबनेल प्राप्त करने के लिए, मैंने एक अलग प्रश्न में पोस्ट की गई विधि को दोबारा शुरू कर दिया है। सबसे पहले, मैं विंडोज एपीआई कोड पैक का संदर्भ देता हूं। फिर, मैं निम्नलिखित कोड का उपयोग करता हूं:

ShellFile shellFile = ShellFile.FromFilePath(fullPathToFile); 
myPictureBox.Image = shellFile.Thumbnail.LargeBitmap; 

यह हमेशा काम नहीं करता है। कभी-कभी, दिखाया गया थंबनेल केवल 'डिफ़ॉल्ट एप्लिकेशन' आइकन होता है। मुझे पता चला है कि असली थंबनेल केवल तभी दिखाया गया है जब विंडोज ने पहले उस फ़ाइल के लिए थंबनेल जेनरेट किया था और इसे थंबनेल कैश में संग्रहीत किया था। इसका मतलब है कि मुझे मैन्युअल रूप से एक फ़ोल्डर खोलना है, प्रत्येक फ़ाइल के लिए विंडोज़ थंबनेल जेनरेट करने के लिए प्रतीक्षा करें, और फिर मेरा आवेदन उन अंगूठे को देख पाएगा।

मेरा प्रोग्राम विंडोज 7 को वास्तविक थंबनेल उत्पन्न करने से पहले कैसे उपयोग कर सकता है?

ShellFile shellFile = ShellFile.FromFilePath(fullPathToFile); 
shellFile.Thumbnail.FormatOption = ShellThumbnailFormatOption.ThumbnailOnly; 
myPictureBox.Image = shellFile.Thumbnail.LargeBitmap; 

हालांकि, मैं हो रही है मामले थंबनेल में एक अपवाद वहाँ अभी तक नहीं है::

अद्यतन (Li0liQ द्वारा)

यह FormatOption जोड़कर थंबनेल पुनः प्राप्ति के लिए मजबूर करने के लिए संभव है

वर्तमान शैल ऑब्जेक्ट में वैध थंबनेल हैंडलर नहीं है या थंबनेल निकालने में कोई समस्या थी इस विशिष्ट शैल ऑब्जेक्ट के लिए। ---> System.Runtime.InteropServices.COMException: कक्षा पंजीकृत नहीं (HRESULT से अपवाद: 0x80040154 (REGDB_E_CLASSNOTREG))

How do I refresh a file's thumbnail in Windows Explorer? सवाल और संभावित सुराग के लिए कोड snippet देखें।

+1

li0liq, आपके त्रुटि संदेश यह नहीं कहते हैं कि थंबनेल अभी तक नहीं है, यह कह रहा है कि थंबनेल उत्पन्न करने के लिए कोई हैंडलर नहीं है। –

उत्तर

-1

जहां तक ​​मुझे पता है कि आप थंबनेल जेनरेट करने के लिए विंडोज 7 को मजबूर नहीं कर सकते हैं। हालांकि, अगर आप इसे अपने द्वारा कोड के साथ बना सकते हैं:

Image image = Image.FromFile(fileName); 
Image thumbNail = image.GetThumbnailImage(120, 120,()=>false, IntPtr.Zero); 
thumbNail.Save(Path.ChangeExtension(fileName, "thumb")); 

http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage.aspx

+1

प्रश्न एक छवि के लिए थंबनेल बनाने से थोड़ा सा व्यापक है। एक सामान्य दृष्टिकोण की आवश्यकता होती है या कम से कम वह जो नव निर्मित पीडीएफ दस्तावेज़ के लिए थंबनेल बनाने की अनुमति देगा। – Li0liQ

0

कुछ खोज के बाद, मैं Microsoft Office Thumbnails in Sharepoint पाया। यह केवल कार्यालय दस्तावेजों पर काम कर सकता है, लेकिन हो सकता है कि आप जो चाहते हैं। कुछ अनुवाद की आवश्यकता होगी क्योंकि उदाहरण C++ और VB.Net में हैं।

+0

लेख में सुझाए गए दृष्टिकोण प्रश्न में कोड की दो पंक्तियों के निम्न स्तर के बराबर हैं और बिल्कुल उसी अपवाद के साथ विफल रहता है: 0x80040154 (REGDB_E_CLASSNOTREG) - जिसका अर्थ है "अभी तक कोई थंबनेल उपलब्ध नहीं है"। – Li0liQ

0

मेरा प्रोग्राम विंडोज 7 को वास्तविक थंबनेल उत्पन्न करने से पहले कैसे उपयोग कर सकता है?

शैल इंटरफेस से

: IThumbnailCache interface (जोर मेरा)

थंबनेल कैश एपीआई एक एकीकृत विधि को पुनः प्राप्त करने और कैश थंबनेल के साथ आवेदन पत्र उपलब्ध कराने के लिए बनाया गया है। विंडोज एक्सपी में, थंबनेल कैशिंग प्रति-फ़ोल्डर आधार पर किया जाता है, और कैश प्रत्येक फ़ोल्डर में Thumbs.db फ़ाइल में बनाए रखा जाता है। हालांकि यह दृष्टिकोण स्थानिक इलाके प्रदान करता है, यह फ़ोल्डर्स में पूर्वावलोकन और क्वेरी का समर्थन नहीं करता है।विंडोज विस्टा में थंबनेल कैश वैश्विक कैश प्रदान करके इस की कमी को संबोधित करता है।

थम्बनेल कैश करने के लिए, एक आवेदन पहले एक IShellItem है कि आइटम जिसके लिए एक थंबनेल प्राप्त की जाएगी प्रतिनिधित्व प्राप्त करना होगा, और फिर IThumbnailCache :: GetThumbnail के लिए एक कॉल करने के लिए IShellItem गुजरती हैं। IThumbnailCache :: GetThumbnail के झंडे पैरामीटर झंडा WTS_EXTRACT शामिल है, और थंबनेल पहले से ही, कैश्ड नहीं होता थम्बनेल निकाला जाएगा और कैश में दे रखा है। यदि ध्वज WTS_FORCEEXTRACTION सेट है, तो कैश को अनदेखा किया जाता है और एक नया थंबनेल हमेशा निकाला जाता है। आईटीएचंबनेल कैश :: झंडे पर अधिक जानकारी के लिए GetHhumbnail विषय देखें IThumbnailCache :: GetThumbnail को पास किया गया।

थम्बनेल पहले से ही नहीं कैश में है, तो वह अपने स्रोत फ़ाइल से IExtractImage की मौजूदा कार्यान्वयन (s) या IThumbnailProvider है कि ऑपरेटिंग सिस्टम पर पंजीकृत है का उपयोग कर निकाला जाएगा। आपके एप्लिकेशन को थंबनेल निकालने का कार्यान्वयन प्रदान करने की आवश्यकता नहीं है।

  1. अपने पीडीएफ के लिए एक खोल आइटम प्राप्त करें:

तो, आपके सिस्टम संभालने IThumbnail प्रदाता है कि पीडीएफ के साथ काम करता के एक कार्यान्वयन है।

  • शैल के थंबनेल कैश का संदर्भ प्राप्त करें। आइए इसे thumbNailCache पर कॉल करें।
  • कॉल thumbNailCache.GetThumbnail(shellItem, thumbNailpx,wtxFlagSet, out thumbNailBitmap);। प्रलेखन का कहना है कि यह आपके लिए थंबनेल बनाएगा और आउटपुट पैरामीटर thumbNailBitmap में इसे वापस कर देगा।
  • चेतावनियां: मैं अगर अपने कोड पैक पूरी तरह से IThumbnailCache को उजागर करता है पता नहीं है, लेकिन अगर यह होता है, यह बहुत सीधे आगे लग रहा है। अगर ऐसा नहीं है तो आपको इसे shell32.dll से आयात करना होगा।

    IThumbnailProvider इंटरफ़ेस भी है जो आपके लिए काम कर सकता है, लेकिन समुदाय की टिप्पणियां पढ़ सकता है। ऐसा लगता है कि यह नाजुक और उपयोग करने में मुश्किल है।

    +0

    क्या आप कोड नमूना दे सकते हैं, शेल आइटम कैसे प्राप्त करें और थंबनेल कैश कैसे प्राप्त करें? –

    3

    यहाँ कोड का एक टुकड़ा है कि थंबनेल बिटमैप्स अर्क (Windows Vista या उच्चतर केवल का उपयोग) है। यह शांत IShellItemImageFactory interface पर आधारित है:

    static void Main(string[] args) 
        { 
         // you can use any type of file supported by your windows installation. 
         string path = @"c:\temp\whatever.pdf"; 
         using (Bitmap bmp = ExtractThumbnail(path, new Size(1024, 1024), SIIGBF.SIIGBF_RESIZETOFIT)) 
         { 
          bmp.Save("whatever.png", ImageFormat.Png); 
         } 
        } 
    
        public static Bitmap ExtractThumbnail(string filePath, Size size, SIIGBF flags) 
        { 
         if (filePath == null) 
          throw new ArgumentNullException("filePath"); 
    
         // TODO: you might want to cache the factory for different types of files 
         // as this simple call may trigger some heavy-load underground operations 
         IShellItemImageFactory factory; 
         int hr = SHCreateItemFromParsingName(filePath, IntPtr.Zero, typeof(IShellItemImageFactory).GUID, out factory); 
         if (hr != 0) 
          throw new Win32Exception(hr); 
    
         IntPtr bmp; 
         hr = factory.GetImage(size, flags, out bmp); 
         if (hr != 0) 
          throw new Win32Exception(hr); 
    
         return Bitmap.FromHbitmap(bmp); 
        } 
    
        [Flags] 
        public enum SIIGBF 
        { 
         SIIGBF_RESIZETOFIT = 0x00000000, 
         SIIGBF_BIGGERSIZEOK = 0x00000001, 
         SIIGBF_MEMORYONLY = 0x00000002, 
         SIIGBF_ICONONLY = 0x00000004, 
         SIIGBF_THUMBNAILONLY = 0x00000008, 
         SIIGBF_INCACHEONLY = 0x00000010, 
         SIIGBF_CROPTOSQUARE = 0x00000020, 
         SIIGBF_WIDETHUMBNAILS = 0x00000040, 
         SIIGBF_ICONBACKGROUND = 0x00000080, 
         SIIGBF_SCALEUP = 0x00000100, 
        } 
    
        [DllImport("shell32.dll", CharSet = CharSet.Unicode)] 
        private static extern int SHCreateItemFromParsingName(string path, IntPtr pbc, [MarshalAs(UnmanagedType.LPStruct)] Guid riid, out IShellItemImageFactory factory); 
    
        [ComImport] 
        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
        [Guid("bcc18b79-ba16-442f-80c4-8a59c30c463b")] 
        private interface IShellItemImageFactory 
        { 
         [PreserveSig] 
         int GetImage(Size size, SIIGBF flags, out IntPtr phbm); 
        } 
    

    अतिरिक्त नोट्स:

    • GetImage विधि विभिन्न रोचक झंडे (SIIGBF) आप के साथ खेल सकते है।
    • प्रदर्शन कारणों से, आप कारखानों को कैश कर सकते हैं। उदाहरण के लिए, पीडीएफ फाइलों को पृष्ठभूमि में लोड करने के लिए पूरे एडोब रीडर .exe की आवश्यकता होती है।
    • शैल (विंडोज एक्सप्लोरर) से बात करते समय, आप यह सुनिश्चित करना चाहते हैं कि आपकी प्रक्रिया उसी कारण से यूएसी स्तर पर है, सुरक्षा कारणों से, कुछ परिचालन विफल हो जाएंगे।तो उदाहरण के लिए, यदि आप विजुअल स्टूडियो में F5 या CTRL + F5 से अपनी प्रक्रिया चलाते हैं, और आपका विजुअल स्टूडियो व्यवस्थापक के रूप में चलता है, तो आपकी प्रक्रिया थंबनेल पुनर्प्राप्त करने में सक्षम नहीं हो सकती है, जबकि यह .exe पर डबल-क्लिक करने पर काम करेगा एक्सप्लोरर से। REGDB_E_CLASSNOTREG इन मामलों में आपको प्राप्त होने वाली एक सामान्य प्रकार की त्रुटि है।
    +0

    मुझे पहले 'Win32Exception (घंटा)' कॉल पर "सिस्टम निर्दिष्ट फ़ाइल नहीं मिल सका" मिल रहा है। हालांकि, अगर मैं 'फाइलएक्सिस्ट्स (फाइलपाथ)' कहता हूं तो मुझे 'True' मिलता है। – Scott

    +0

    लेकिन अगर मैं shell32 से 'PathResolve' आयात करता हूं, तो यह मुझे बताता है कि फ़ाइल नहीं है .... – Scott

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