Pregunta

Me gustaría invocar protector de la pantalla del usuario si se ha definido tal, en un entorno Windows.

Sé que se puede hacer usando puro código C ++ (y luego la envoltura en C # es bastante simple), como se sugiere aquí .

Sin embargo, por curiosidad, me gustaría saber si dicha tarea puede realizarse por código puramente logrado utilizando el marco de la red del punto (versión 2.0 y superior), sin p / invocar y sin visitar el lado de C ++ (que, a su su vez, puede utilizar la API de windows con bastante facilidad).

¿Fue útil?

Solución

Tengo una idea, no estoy seguro de cómo consistentemente esto funcionaría, por lo que había necesidad de investigar un poco, creo, pero es de esperar que sea suficiente para que pueda empezar.

Un protector de pantalla es sólo un ejecutable, y el registro almacena la ubicación de este archivo ejecutable en HKCU\Control Panel\Desktop\SCRNSAVE.EXE

A mi copia de Vista, esto funcionó para mí:

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

Otros consejos

Creo que tener una función de biblioteca .Net que hace esto es muy poco probable - No estoy al tanto de ninguna. Una búsqueda rápida regresó este Proyecto Código tutorial que contiene un ejemplo de un contenedor administrado lo que usted ha mencionado en su pregunta.

existe P / Invoke para que usted es capaz de acceder a las características específicas del OS, de los cuales los protectores de pantalla son un ejemplo.

No estoy seguro de que puede utilizar el código completamente logrado hacer esto.

Esto utiliza la API de Windows, pero todavía es muy simple: Lanzamiento Sistema protector de pantalla de C # Forma ventanas

El trabajo en cualquier versión 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);
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top