Domanda

Mi piacerebbe richiamare screen saver dell'utente se tale è definito, in un ambiente Windows.

Lo so che può essere fatto utilizzando puro codice C ++ (e quindi l'involucro in C # è piuttosto semplice), come suggerito qui .

Ancora, per curiosità, mi piacerebbe sapere se tale operazione può essere compiuta dal codice puramente gestito utilizzando il framework dot net (versione 2.0 e superiori), senza P / Invoke e senza aver visitato il lato C ++ (che, in girare, possono utilizzare Windows API abbastanza facilmente).

È stato utile?

Soluzione

Ho un'idea, io non sono sicuro di come costantemente questo funzionerebbe, così avresti bisogno di ricerca un po 'che penso, ma si spera che sia abbastanza per iniziare.

Uno screen saver è solo un eseguibile, e il Registro di sistema memorizza la posizione di questo eseguibile in HKCU\Control Panel\Desktop\SCRNSAVE.EXE

Sulla mia copia di Vista, questo ha funzionato per me:

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
    }
}

Altri suggerimenti

Credo che avere una funzione di libreria Net che fa questo è altamente improbabile - Io non sono a conoscenza di alcuna. Una rapida ricerca ha restituito questo Progetto codice esercitazione che contiene un esempio di un wrapper gestito che lei ha citato nella sua interrogazione.

P / Invoke esiste in modo che siete in grado di accedere alle funzionalità specifiche del sistema operativo, dei quali screen saver sono un esempio.

Non sono sicuro che è possibile utilizzare il codice completamente riuscito a fare questo.

Questo utilizza API di Windows, ma è ancora molto semplice: Avviare Sistema Screensaver da C # Windows Form

Lavorare su qualsiasi versione di 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);
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top