2009-08-27 8 views
7

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

उदाहरण के लिए , 3 डी फ्लॉवरबॉक्स स्क्रीन सेवर में Direct3D FlowerBox का फ़ाइल विवरण है। और मुझे कहीं भी "3 डी फ्लॉवरबॉक्स" नहीं मिल रहा है।

यह जानकारी कहां संग्रहीत की जाती है? और मैं इसे कैसे प्राप्त कर सकता हूं।

उत्तर

5

यह सवाल थोड़ा पुराना है, लेकिन मैं सिर्फ एक ही समस्या को हल करने के लिए किया था और निम्नलिखित समाधान के साथ आया था:

public class ScreenSaverInfo 
{ 
    public string FileName { get; set; } 
    public string Name { get; set; } 
} 

public IEnumerable<ScreenSaverInfo> GetScreenSavers() 
{ 
    string currentSSPath = null; 
    using (RegistryKey desktopKey = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop")) 
    { 
     if (desktopKey != null) 
     { 
      string screenSaverExe = desktopKey.GetValue("SCRNSAVE.EXE") as string; 
      if (!string.IsNullOrEmpty(screenSaverExe)) 
      { 
       currentSSPath = Path.GetDirectoryName(screenSaverExe); 
      } 
     } 
    } 

    HashSet<string> directories = new HashSet<string>(); 
    directories.Add(Environment.GetFolderPath(Environment.SpecialFolder.System)); 
    directories.Add(Environment.GetFolderPath(Environment.SpecialFolder.SystemX86)); 
    if (currentSSPath != null) 
     directories.Add(currentSSPath); 

    foreach (string dir in directories) 
    { 
     foreach (string file in Directory.EnumerateFiles(dir, "*.scr", SearchOption.TopDirectoryOnly)) 
     { 
      yield return GetScreenSaverInfo(file); 
     } 
    } 
} 

public ScreenSaverInfo GetScreenSaverInfo(string filename) 
{ 
    IntPtr hLibrary = IntPtr.Zero; 
    try 
    { 
     hLibrary = LoadLibrary(filename); 
     StringBuilder sb = new StringBuilder(1024); 
     LoadString(hLibrary, 1, sb, sb.Capacity); 
     return new ScreenSaverInfo 
     { 
      FileName = filename, 
      Name = sb.ToString() 
     }; 
    } 
    finally 
    { 
     if (hLibrary != IntPtr.Zero) 
      FreeLibrary(hLibrary); 
    } 
} 

[DllImport("kernel32.dll")] 
static extern IntPtr LoadLibrary(string lpFileName); 

[DllImport("kernel32.dll")] 
static extern bool FreeLibrary(IntPtr hLibrary); 

[DllImport("user32")] 
static extern int LoadString(IntPtr hInstance, int wID, [Out] StringBuilder lpBuffer, int nBufferMax); 

असल में, स्क्रीनसेवर के प्रदर्शन नाम में पहली संसाधन स्ट्रिंग है एसएससीआर फ़ाइल। ध्यान दें कि कुछ स्क्रीनसेवर (जैसे विंडोज़ अंतर्निहित स्क्रीनसेवर) के लिए, स्थानीय संसाधन मुख्य .scr फ़ाइल में नहीं हैं बल्कि एक .scr.mui फ़ाइल में संस्कृति-विशिष्ट उपनिर्देशिका में हैं। आपको इसके बारे में चिंता करने की ज़रूरत नहीं है, क्योंकि LoadString जानता है कि पर्याप्त संसाधन कहां मिलना है।

+0

बहुत बढ़िया .. मुझे पूरी तरह से एहसास नहीं हुआ कि यह संभव था। –

0

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

+0

उस उत्तर के साथ क्या गलत है? –

+0

खुद ही एक ही चीज़ सोच रहा था। :) –

2

question I once asked here about screen saver पर एक नज़र डालें। यह समाधान के लिए एक दिशा है। इसके अलावा, ऐसा लगता है कि ढांचे में ऐसी कोई चीज मौजूद नहीं है।

HTH,

0

मैं सभी प्रणाली पर खोजा गया ... रजिस्ट्री की जाँच की, नाम के लिए हर फ़ाइल की सामग्री की खोज, एक हेक्स दर्शक में .scr फ़ाइलों को खोला है, लेकिन कहीं भी नामों को कभी नहीं मिल सकता है ... मैंने फिर भी अन्य स्क्रीन सेवर स्थापित करने का प्रयास किया और देखा कि हमेशा फ़ाइल नाम के रूप में सेटिंग में दिखाया गया है। मैंने जो कुछ भी फ़ाइल नाम बदल दिया, वहां दिखाई दिया। तो गैर मानक स्क्रीन सेवर के लिए यह किसी विशेष नाम की तलाश नहीं कर रहा है ... इससे मुझे विश्वास होता है कि निर्मित स्क्रीन सेवर के नाम किसी भी तरह से विशेष मामलों के रूप में सेटिंग संवाद में कोड किए गए थे।

तो मैंने अपने ऐप में भी यही काम किया ... बस सभी विशेष मामलों की एक सरणी बनाई और तदनुसार संभाला। लगता है कि एकमात्र विकल्प है।

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