Come posso cambiare a livello di screensaver a livello di programmazione?
-
28-10-2019 - |
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.
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