2009-08-27 9 views
7

Windowsスクリーンセーバーのダイアログに表示されるリストと基本的に同じスクリーンセーバーの名前を表示できます。私が実行した問題は、ダイアログボックスのドロップダウンリストに表示される名前が、ファイル名、埋め込みファイル情報、レジストリ内の何かに対応していないようです。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

驚くばかり。私は完全にそれが可能であることを認識していませんでした。 –

0

私の推測では、システム上のどこにも見つからなければ、何らかの種類のメタデータとしてアセンブリに格納されていると思います。バイナリエディタでファイルを開き、探している名前を検索します。

+0

その答えに何が問題なのですか? –

+0

自分自身で同じことを思っていた。 :) –

0

私は...、すべてのシステム上で検索レジストリをチェックし、名前のすべてのファイルの内容を検索、六角ビューアで.scrのファイルを開いたが、どこにも名前を見つけることができなかったん...私はまた、他のスクリーンセーバーをインストールしようとしたときに、常にファイル名として設定に表示されていることに気づいた。私がファイル名を変更したものがあれば、そこに現れた。標準以外のスクリーンセーバーの場合、特別な名前は探していません...これは、スクリーンセーバーの名前が特別なケースとして設定ダイアログに何らかの形でハードコードされていると私に信じさせます。

私はアプリで同じことをしました...すべての特殊なケースの配列を作成し、それに応じて処理しました。唯一の選択肢と思われます。

関連する問題