Как вызвать заставку в Windows в C #? - PullRequest
2 голосов
/ 29 мая 2009

Я бы хотел вызвать экранную заставку пользователя, если она определена, в среде Windows.

Я знаю, что это можно сделать, используя чистый код C ++ (а затем обёртывание в C # довольно простое), как было предложено здесь .

Тем не менее, для любопытства я хотел бы знать, может ли такая задача быть выполнена с помощью чисто управляемого кода с использованием инфраструктуры dot net (версия 2.0 и выше), без вызова p / и без посещения стороны C ++ (которая в можно использовать Windows API довольно легко).

Ответы [ 4 ]

3 голосов
/ 30 мая 2009

У меня есть идея, я не уверен, насколько последовательно это будет работать, поэтому я думаю, вам нужно немного исследовать, но, надеюсь, этого достаточно, чтобы начать работу.

Заставка - это просто исполняемый файл, а реестр хранит местоположение этого исполняемого файла в HKCU\Control Panel\Desktop\SCRNSAVE.EXE

На моей копии Vista это работало для меня:

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
    }
}
1 голос
/ 30 мая 2009

Я думаю, что наличие библиотеки .Net, которая делает это, крайне маловероятно - я не знаю ни о чем. Быстрый поиск вернул этот код Project tutorial , который содержит пример управляемой оболочки, которую вы упомянули в своем вопросе.

P / invoke существует, так что вы можете получить доступ к функциям, зависящим от ОС, примером которых являются хранители экрана.

0 голосов
/ 03 февраля 2016

Работа на любой версии 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);
        }
    }
}
0 голосов
/ 30 мая 2009

Я не уверен, что вы можете использовать полностью управляемый код для этого.

Это использует Windows API, но все еще очень просто: Запустить системную заставку из C # Windows Form

...