C #: Получить имена установленных заставок - PullRequest
7 голосов
/ 27 августа 2009

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

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

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

Ответы [ 4 ]

5 голосов
/ 15 ноября 2009

Этот вопрос немного устарел, но мне просто пришлось решить ту же проблему, и я нашел следующее решение:

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 знает, где найти подходящий ресурс.

2 голосов
/ 27 августа 2009

Взгляните на вопрос, который я однажды задал здесь о заставке . Это направление к решению. Кроме того, кажется, что в самом фреймворке такой вещи не существует.

НТН,

0 голосов
/ 10 сентября 2009

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

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

0 голосов
/ 27 августа 2009

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

...