2009-08-27 2 views
7

Я хочу показать в основном тот же список, что и в диалоговом окне Windows Screen Saver, с именем каждой экранной заставки. Однако проблема, с которой я столкнулся, заключается в том, что имена, отображаемые в раскрывающемся списке в диалоговом окне, похоже, не соответствуют имени файла, информации о встроенных файлах, что-либо в реестре и т. Д.C#: Получить имена установленных хранителей экрана

Например , экранная заставка 3D FlowerBox имеет описание файла Direct3D FlowerBox. И я не могу найти только «3D FlowerBox» в любом месте.

Где хранится эта информация? И как его получить.

ответ

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. Обратите внимание, что для некоторых заставок (например, встроенных заставщиков Windows) локализованные ресурсы не находятся в основном файле .scr, а в файле .scr.mui в подкаталоге, специфичном для культуры. Вам не о чем беспокоиться, потому что LoadString знает, где найти адекватный ресурс.

+0

Awesome..I полностью не понял, что было возможно. –

0

Я предполагаю, что если вы не можете найти его где-нибудь в системе, он хранится в сборке как мета-данные. Откройте файл с помощью двоичного редактора и найдите имя, которое вы ищете.

+0

Что случилось с этим ответом? –

+0

Чувствовал то же самое сам. :) –

0

Я искал по всей системе ... проверил реестр, обыскали содержимое каждого файла для имен, открыл .scr файлы в шестнадцатеричном зрителя, но никогда не мог найти имена в любом месте ... Я также попытался установить другие хранители экрана и заметил, что всегда отображались в настройках как имя файла. Что бы я ни изменил имя файла, появился там. Поэтому для нестандартных хранителей экрана он не ищет каких-либо специальных имен ... это заставило меня поверить, что имена встроенных хранителей экрана были как-то жестко закодированы в диалоговом окне настроек в виде особых случаев.

Так что я сделал то же самое в своем приложении ... просто сделал массив всех особых случаев и обработал соответственно. Кажется, это единственный вариант.

 Смежные вопросы

  • Нет связанных вопросов^_^