Comment puis-je changer l'écran de veille programme?
-
28-10-2019 - |
Question
Je voudrais changer l'économiseur d'écran actuel pour un personnalisé (qui je l'ai déjà chargé en tant que ressource dans Visual Studio) en utilisant C #. Comment cela pourrait-il faire? J'ai cherché sur Google et SO, mais toutes les discussions sur « Comment créer un écran de veille », et non « Comment changer un écran de veille ». Si possible, il devrait fonctionner sur Windows XP, Vista et 7.
La solution
Je vais répondre à ma question avec le morceau de code qui a fonctionné pour moi:
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());
}
}
}
Ensuite, lors de l'appel de ma demande:
static string ResourcePath(string resource)
{
return Application.StartupPath + "\\Resources\\" + resource;
}
Program.Screensaver.Set(Program.ResourcePath("svr1.scr"));
Je lis quelque part que je devrais écrire un nom plus de 8 caractères (un peu bizarre, mais XP est tout comme ça), de sorte que mon écran de veille est appelé svr1.scr
(pas vraiment orienté objet, mais le tour est joué)
Autres conseils
Ceci est la commande que Windows exécute lors de l'installation d'un nouveau
rundll32.exe desk.cpl,InstallScreenSaver %l