2011-12-05 17 views
5

Chciałbym zmienić obecny wygaszacz ekranu dla niestandardowego (który wcześniej załadowałem jako zasób w Visual Studio) przy użyciu C#. Jak można to zrobić? Szukałem go w Google i SO, ale wszystko mówi o "Jak stworzyć wygaszacz ekranu", a nie "Jak zmienić wygaszacz ekranu". Jeśli to możliwe, to powinno działać na WinXP, Vista i 7.Jak programowo zmienić wygaszacz ekranu?

+0

Ten może być przydatny: http://bytes.com/topic/c-sharp/answers/263953-setting-up-screensaver-via-csharp-c-application Musisz to zrobić poprzez rejestr –

+0

Dzięki za twój link. To złagodziło kroki. Jednak nie działa dla Windows XP (w Win7 działa jak urok). Czy wiesz coś o tym? – Korcholis

Odpowiedz

4

będę odpowiedzieć na moje pytanie z kawałka kodu, który pracował do mi:

public sealed class Screensaver 
{ 
    Screensaver() { } 

    const int SPI_SETSCREENSAVEACTIVE = 0x0011; 

    [DllImport("user32", CharSet=CharSet.Auto)] 
    unsafe public static extern short SystemParametersInfo (int uiAction, int uiParam, int* pvParam, int fWinIni); 

    public static void Set(string path) 
    { 
     try 
     { 
      RegistryKey oKey = Registry.CurrentUser.OpenSubKey("Control Panel", 
      true); 
      oKey = oKey.OpenSubKey("desktop", true); 
      oKey.SetValue("SCRNSAVE.EXE", path); 
      oKey.SetValue("ScreenSaveActive", "1"); 

      unsafe 
      { 
       int nX = 1; 
       SystemParametersInfo(
       SPI_SETSCREENSAVEACTIVE, 
       0, 
       &nX, 
       0 
       ); 
      } 
     } 
     catch (Exception exc) 
     { 
      System.Windows.Forms.MessageBox.Show(exc.ToString()); 
     } 
    } 
} 

Potem, kiedy wywołanie go z mojej aplikacji:

static string ResourcePath(string resource) 
{ 
    return Application.StartupPath + "\\Resources\\" + resource; 
} 

Program.Screensaver.Set(Program.ResourcePath("svr1.scr")); 

czytałem gdzieś Powinienem napisać imię nie dłuższe niż 8 znaków (trochę dziwne, ale XP to wszystko), więc mój wygaszacz ekranu nazywa się svr1.scr (nie jest to obiekt zorientowany, ale działa)

+1

Brzydko, ale nie mogę znaleźć lepszego rozwiązania. 'InstallScreenSaver' w' desk.cpl' wyświetla następnie interfejs panelu sterowania, a 'SystemParametersInfo' wydaje się nie eksponować tej funkcji. – CodesInChaos

0

Jest to polecenie, że okna wykonuje podczas instalowania nowej

rundll32.exe desk.cpl,InstallScreenSaver %l 
Powiązane problemy