Включить / выключить монитор - PullRequest
47 голосов
/ 03 апреля 2009

Можно ли программно включить / выключить монитор с помощью кода (C #)?

Ответы [ 8 ]

30 голосов
/ 03 апреля 2009

Вы даже пытались погуглить?

Первый удар: http://www.codeproject.com/KB/cs/Monitor_management_guide.aspx

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

(я догадался, что вам нужно решение C #, потому что это единственный тег, который вы применили).

РЕДАКТИРОВАТЬ 8 февраля 2013 г .:

Было упомянуто, что решение больше не работает под Windows 7 и 8. Хорошо, вот то, которое хорошо работает под Windows 7, еще не пробовал Windows 8.

http://cocoa.ninja/posts/Turn-off-your-monitor-in-Csharp.html

namespace MonitorOff {

    public enum MonitorState {
        MonitorStateOn = -1,
        MonitorStateOff = 2,
        MonitorStateStandBy = 1
    }

    public partial class Form1 : Form {
        [DllImport("user32.dll")]
        private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);

        public Form1() {
            InitializeComponent();
            SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
        }

        void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e) {
            SetMonitorInState(MonitorState.MonitorStateOff);
        }

        private void button1_Click(object sender, EventArgs e) {
            SetMonitorInState(MonitorState.MonitorStateOff);
        }

        private void SetMonitorInState(MonitorState state) {
            SendMessage(0xFFFF, 0x112, 0xF170, (int)state);
        }
    }
}
17 голосов
/ 03 апреля 2009

Нажмите кнопку включения / выключения


Если вы хотите сделать это в коде, очевидно, это возможно в Win32 API:

SendMessage hWnd, WM_SYSCOMMAND, SC_MONITORPOWER, параметр

, где WM_SYSCOMMAND = 0x112 и SC_MONITORPOWER = 0xF170 и Параметр указывает режим для установки монитора: -1: вкл 2: выкл 1: энергосберегающий режим

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

int WM_SYSCOMMAND = 0x112;
int SC_MONITORPOWER = 0xF170;

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

public static void Main(string[] args)
{
    Form f = new Form();
    bool turnOff = true;   //set true if you want to turn off, false if on
    SendMessage(f.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)(turnOff ? 2 : -1));
}

Обратите внимание, что я на самом деле не пробовал это ...

14 голосов
/ 05 февраля 2013

Ответ https://stackoverflow.com/a/713504/636189 выше отлично подходит для выключения монитора Windows 7/8, но не для его пробуждения. На этих системах вам нужно сделать что-то вроде хакерства (как найдено https://stackoverflow.com/a/14171736/636189):

[DllImport("user32.dll")]
static extern void mouse_event(Int32 dwFlags, Int32 dx, Int32 dy, Int32 dwData, UIntPtr dwExtraInfo);

private const int MOUSEEVENTF_MOVE = 0x0001;

private void Wake(){
mouse_event(MOUSEEVENTF_MOVE, 0, 1, 0, UIntPtr.Zero);
Sleep(40);
mouse_event(MOUSEEVENTF_MOVE, 0, -1, 0, UIntPtr.Zero);
}
12 голосов
/ 11 января 2014

Этот код может быть полезен для включения и выключения. Он также работал в Windows 7.

   private int SC_MONITORPOWER = 0xF170;

    private uint WM_SYSCOMMAND = 0x0112;

    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);



    enum MonitorState
    {
        ON = -1,
        OFF = 2,
        STANDBY = 1
    }
    private void SetMonitorState(MonitorState state)
    {
        Form frm = new Form();

        SendMessage(frm.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)state);

    }

Для вызова функции вы должны сделать так:

SetMonitorState(MonitorState.ON);

OR

SetMonitorState(MonitorState.OFF);

Примечание. Этот код протестирован в приложении WPF. Со следующими пространствами имен:

using System.Runtime.InteropServices;
using System.Windows.Forms;
11 голосов
/ 25 марта 2014

Для тех, кому нужны эти функции в консольном приложении :

using System;
using System.Runtime.InteropServices;
using System.Timers;

namespace TurnScreenOFF
{
    class Program
    {
        private static int WM_SYSCOMMAND = 0x0112;
        private static uint SC_MONITORPOWER = 0xF170;

        public static void Main(string[] args)
        {
            SendMessage(GetConsoleWindow(), WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)2);
        }

        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
    }
}

Адаптировано и протестировано. 100% работает на Windows 8.

6 голосов
/ 11 сентября 2015

Я не смог найти пример копирования-вставки, поэтому создал его сам, не забудьте добавить ссылку на System.Windows.Forms.

using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;


namespace monitor_on_off
{
    class Program
    {
        [DllImport("user32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
        [DllImport("user32.dll")]
        static extern void mouse_event(Int32 dwFlags, Int32 dx, Int32 dy, Int32 dwData, UIntPtr dwExtraInfo);

        private const int WmSyscommand = 0x0112;
        private const int ScMonitorpower = 0xF170;
        private const int MonitorShutoff = 2;
        private const int MouseeventfMove = 0x0001;

        public static void MonitorOff(IntPtr handle)
        {
            SendMessage(handle, WmSyscommand, (IntPtr)ScMonitorpower, (IntPtr)MonitorShutoff);
        }

        private static void MonitorOn()
        {
            mouse_event(MouseeventfMove, 0, 1, 0, UIntPtr.Zero);
            Thread.Sleep(40);
            mouse_event(MouseeventfMove, 0, -1, 0, UIntPtr.Zero);
        }

        static void Main()
        {
            var form = new Form();

            while (true)
            {
                MonitorOff(form.Handle);
                Thread.Sleep(5000);
                MonitorOn();
                Thread.Sleep(5000);
            }
        }
    }
}
3 голосов
/ 11 мая 2015

Я прошел каждый метод, который все опубликовали, чтобы уложить монитор в спящий режим и разбудить его позже в другое время. Конечно, SendMessage() работает с Windows XP, но не выводит монитор из спящего режима после определенного периода времени. Я пытался использовать C #, DOS, скрипты для игры с профилями мощности и Powershell. В конце концов я сдался и вернулся к началу, и моя первая мысль оказалась верной. Вам нужно использовать PostMessage() после выключения монитора, еще лучше, вы, вероятно, всегда должны использовать PostMessage();


Так что весь код, который вы видели раньше, верен, вместо этого используйте следующее:

using System.Runtime.InteropServices;
[DllImport("user32.dll")]
static extern IntPtr PostMessage(int hWnd, int msg, int wParam, int lParam);
PostMessage(-1, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);

В настоящее время выполняется и работает надлежащим образом (11 мая 2015 г.). Я бегу

  • Windows 7 Профессиональная версия 6.1.7601 с пакетом обновления 1, сборка 7601
  • Visual Studio Profesional 2013 Версия 12.0.31101.00 Обновление 4
  • .NET Framework 4.5.51209
  • C #

Моя система полностью обновлена.

1 голос
/ 16 октября 2015

Ответ с наименьшим SLOC:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

static class Program
{
    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

    [STAThread]
    static void Main()
    {
        SendMessage(new Form().Handle, 0x0112, 0xF170, 2);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...