2009-08-27 21 views
7

Tôi muốn có thể hiển thị cơ bản cùng một danh sách mà hộp thoại Windows Screen Saver hiển thị, với tên của mỗi trình bảo vệ màn hình. Tuy nhiên, vấn đề tôi gặp phải là tên hiển thị trong danh sách thả xuống trên hộp thoại dường như không tương ứng với tên tệp, thông tin tệp được nhúng, bất kỳ nội dung nào trong sổ đăng ký, v.v.C#: Lấy tên của Trình bảo vệ màn hình được cài đặt

Ví dụ , Trình bảo vệ màn hình FlowerBox 3D có mô tả tệp của Hộp hoa Direct3D. Và tôi không thể tìm thấy "3D FlowerBox" ở bất cứ đâu.

Thông tin này được lưu trữ ở đâu? Và làm cách nào tôi có thể truy xuất nó.

Trả lời

5

Câu hỏi này là một chút cũ, nhưng tôi chỉ phải giải quyết cùng một vấn đề và đưa ra các giải pháp sau đây:

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); 

Về cơ bản, tên hiển thị của màn hình là chuỗi tài nguyên đầu tiên trong .scr. Lưu ý rằng đối với một số trình bảo vệ màn hình (ví dụ: các trình bảo vệ màn hình tích hợp sẵn Windows), các tài nguyên được bản địa hóa không có trong tệp .scr chính nhưng trong tệp .scr.mui trong một thư mục con văn hóa cụ thể. Bạn không cần phải lo lắng về nó, bởi vì LoadString biết nơi để tìm nguồn tài nguyên đầy đủ.

+0

Awesome..Tôi hoàn toàn không nhận ra điều đó là có thể. –

0

Đoán của tôi là nếu bạn không thể tìm thấy nó ở bất cứ nơi nào trên hệ thống, nó được lưu trữ trong hội đồng như một số loại dữ liệu meta. Mở tệp bằng trình chỉnh sửa nhị phân và tìm kiếm tên bạn đang tìm kiếm.

+0

Có gì sai với câu trả lời đó? –

+0

Đã tự hỏi chính bản thân mình. :) –

0

Tôi đã tìm kiếm khắp nơi trên hệ thống ... đã kiểm tra registry, tìm kiếm các nội dung của tất cả các tập tin cho tên, mở file .scr trong một xem hex, nhưng không bao giờ có thể tìm thấy những cái tên bất cứ nơi nào ... Tôi cũng đã thử cài đặt các trình bảo vệ màn hình khác và nhận thấy rằng luôn hiển thị trong cài đặt dưới dạng tên tệp. Dù tôi đã thay đổi tên tập tin thành, xuất hiện ở đó. Vì vậy, đối với các trình bảo vệ màn hình không chuẩn, nó không tìm kiếm bất kỳ tên đặc biệt nào ... điều này khiến tôi tin rằng tên của các trình bảo vệ màn hình được viết bằng cách nào đó được mã hóa cứng vào hộp thoại cài đặt như các trường hợp đặc biệt.

Vì vậy, tôi đã làm điều tương tự trong ứng dụng của mình ... chỉ cần tạo một loạt các trường hợp đặc biệt và được xử lý tương ứng. Có vẻ là lựa chọn duy nhất.

Các vấn đề liên quan