سؤال

أرغب في استدعاء شاشة التوقف للمستخدم إذا تم تعريف هذا هذا، في بيئة Windows.

أعلم أنه يمكن القيام به باستخدام رمز C ++ النقي (ثم التفاف في C # بسيط جدا)، كما هو مقترح هنا.

لا يزال، بالنسبة للفضول، أود أن أعرف ما إذا كان يمكن تحقيق مثل هذه المهمة من خلال التعليمات البرمجية المدارة بحتة باستخدام إطار Dot Net (الإصدار 2.0 وما فوق)، دون P / INCACK وبدون زيارة جانب C ++ (الذي، بدوره، استخدام ويندوز API بسهولة جدا).

هل كانت مفيدة؟

المحلول

لدي فكرة، لست متأكدا من مدى عمل ذلك باستمرار، لذلك كنت بحاجة إلى البحث قليلا وأعتقد، ولكن نأمل أن يكفي أن تبدأك.

شاشة التوقف هي مجرد قابل للتنفيذ، ويخزن السجل موقع هذا الملف القابل للتنفيذ في HKCU\Control Panel\Desktop\SCRNSAVE.EXE

على نسختي من فيستا، هذا عملت بالنسبة لي:

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

نصائح أخرى

أعتقد أن وجود وظيفة مكتبة .NET هل هذا غير مرجح للغاية - أنا لست على علم بأي شيء. عاد البحث السريع مشروع الرمز هذا الدورة التعليمية الذي يحتوي على مثال على التفاف المدار الذي ذكرته في سؤالك.

P / Invoke موجود بحيث تتمكن من الوصول إلى ميزات نظام التشغيل الخاصة، والتي تكون مدخرات الشاشة مثالا.

لست متأكدا من أنه يمكنك استخدام التعليمات البرمجية المدارة بالكامل للقيام بذلك.

هذا يستخدم Windows API ولكن لا يزال بسيطا للغاية: إطلاق شاشة التوقف من نموذج C # Windows

العمل على أي إصدار من 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);
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top