Frage

Ich möchte die Benutzer-Bildschirmschoner aufzurufen, wenn eine solche definiert ist, in einer Windows-Umgebung.

Ich weiß, kann sie unter Verwendung von reinen C ++ Code durchgeführt werden (und dann in C # der Verpackung ziemlich einfach ist), wie vorgeschlagen hier .

Doch für Neugier, würde ich gerne wissen, ob eine solche Aufgabe durch rein verwalteten Code mit dem Punkt net framework (Version 2.0 und höher) erreicht werden kann, ohne p / aufrufen und ohne die C ++ Seite zu besuchen (die in drehen, kann Windows-API ziemlich leicht) verwenden.

War es hilfreich?

Lösung

ich eine Idee habe, bin ich nicht sicher, wie konsequent würde dies umgehen, so dass Sie ein wenig zu erforschen brauchen würde ich denken, aber hoffentlich ist es genug, um Ihnen den Start.

Ein Bildschirmschoner ist nur eine ausführbare Datei und die Registrierung wird die Lage dieser ausführbaren Datei in HKCU\Control Panel\Desktop\SCRNSAVE.EXE

Auf meiner Kopie von Vista, das war für mich:

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

Andere Tipps

Ich denke, eine .NET-Library-Funktion hat, die tut dies sehr unwahrscheinlich ist - ich bin mir nicht bewusst jeder. Eine schnelle Suche ergab diesen Code Project Tutorial , die ein Beispiel eines verwalteten Wrappers enthält die Sie in Ihrer Frage erwähnt.

P / invoke vorhanden, so dass Sie in der Lage sind OS-spezifischen Funktionen zugreifen, von denen Bildschirmschoner ein Beispiel sind.

Ich bin mir nicht sicher, dass Sie vollständig verwalteten Code verwenden können, dies zu tun.

Dies verwendet die Windows-API ist aber immer noch sehr einfach: Start-System Screensaver von C # Windows Form

Das Arbeiten an jeder Version von 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);
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top