Domanda

Vorrei cambiare lo screensaver corrente per uno personalizzato (che in precedenza ho caricato come risorsa in Visual Studio) usando C#. Come si potrebbe fare? L'ho cercato su Google e così, ma tutto parla di "come creare uno screensaver", non "come cambiare un salvaschermo". Se possibile, dovrebbe funzionare su WinXP, Vista e 7.

È stato utile?

Soluzione

I'll answer my question with the piece of code that worked to me:

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

Then, when calling it from my application:

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

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

I read somewhere I should write a name no longer than 8 characters (a bit weird, but XP is all like this), so my screensaver is called svr1.scr (not really object oriented, but does the trick)

Altri suggerimenti

This is the command that windows executes when installing a new one

rundll32.exe desk.cpl,InstallScreenSaver %l
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top