Question

Je voudrais invoquer l'économiseur d'écran de l'utilisateur si tel est défini, dans un environnement Windows.

Je sais que cela peut être fait en utilisant le code C ++ pur (et l'emballage en C # est assez simple), comme l'a suggéré ici .

Pourtant, la curiosité, je voudrais savoir si cette tâche peut être accomplie par un code purement géré en utilisant le point net framework (version 2.0 et plus), sans p / invoquer et sans visiter le côté C (qui, tour, peut utiliser assez facilement API windows).

Était-ce utile?

La solution

J'ai une idée, je ne sais pas comment cela fonctionnerait toujours, vous aurez besoin de la recherche un peu, je pense, mais nous espérons qu'il est suffisant pour vous aider à démarrer.

Un économiseur d'écran est juste un exécutable, et le registre stocke l'emplacement de cet exécutable dans HKCU\Control Panel\Desktop\SCRNSAVE.EXE

Sur ma copie de Vista, cela a fonctionné pour moi:

RegistryKey screenSaverKey = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop");
if (screenSaverKey != null)
{
    string screenSaverFilePath = screenSaverKey.GetValue("SCRNSAVE.EXE", string.Empty).ToString();
    if (!string.IsNullOrEmpty(screenSaverFilePath) && File.Exists(screenSaverFilePath))
    {
        Process screenSaverProcess = Process.Start(new ProcessStartInfo(screenSaverFilePath, "/s"));  // "/s" for full-screen mode
        screenSaverProcess.WaitForExit();  // Wait for the screensaver to be dismissed by the user
    }
}

Autres conseils

Je pense avoir une fonction de bibliothèque .Net qui fait cela est très peu probable - Je ne suis pas au courant. Une recherche rapide est retourné ce Code du projet tutoriel qui contient un exemple d'un wrapper managé que vous avez mentionné dans votre question.

P / Invoke existe de sorte que vous êtes en mesure d'accéder à des fonctionnalités spécifiques à l'OS, dont les économiseurs d'écran sont un exemple.

Je ne suis pas sûr que vous pouvez utiliser le code complètement réussi à le faire.

Il utilise l'API Windows, mais est toujours très simple: système de lancement d'écran de C # windows Form

Travailler sur toutes les versions de Windows ...

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace HQ.Util.Unmanaged
{
    public class ScreenSaverHelper
    {
        [DllImport("User32.dll")]
        public static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
        private static extern IntPtr GetDesktopWindow();

        // Signatures for unmanaged calls
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern bool SystemParametersInfo(int uAction, int uParam, ref int lpvParam, int flags);

        // Constants
        private const int SPI_GETSCREENSAVERACTIVE = 16;
        private const int SPI_SETSCREENSAVERACTIVE = 17;
        private const int SPI_GETSCREENSAVERTIMEOUT = 14;
        private const int SPI_SETSCREENSAVERTIMEOUT = 15;
        private const int SPI_GETSCREENSAVERRUNNING = 114;
        private const int SPIF_SENDWININICHANGE = 2;

        private const uint DESKTOP_WRITEOBJECTS = 0x0080;
        private const uint DESKTOP_READOBJECTS = 0x0001;
        private const int WM_CLOSE = 16;

        public const uint WM_SYSCOMMAND = 0x112;
        public const uint SC_SCREENSAVE = 0xF140;
        public enum SpecialHandles
        {
            HWND_DESKTOP = 0x0,
            HWND_BROADCAST = 0xFFFF
        }
        public static void TurnScreenSaver(bool turnOn = true)
        {
            // Does not work on Windows 7
            // int nullVar = 0;
            // SystemParametersInfo(SPI_SETSCREENSAVERACTIVE, 1, ref nullVar, SPIF_SENDWININICHANGE);

            // Does not work on Windows 7, can't broadcast. Also not needed.
            // SendMessage(new IntPtr((int) SpecialHandles.HWND_BROADCAST), WM_SYSCOMMAND, SC_SCREENSAVE, 0);

            SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, (IntPtr)SC_SCREENSAVE, (IntPtr)0);
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top