вторник, 19 декабря 2017 г.

C# - отправить монитор в сон

Вводная: Есть телевизор, он используется исключительно как монитор и подключен к компьютеру. Настроено автовыключение при пропадании сигнала и соответственно включение при его появлении. Но есть несколько моментов:
1) Если выключаешь не с пульта, а с кнопки на телевизоре, то при появлении сигнала сам не включается - надо обязательно опять её нажать вручную.
2) На компьютере настроен таймаут 15 минут - его менять не хотелось. А иногда ждать эти пятнадцать минут не хочется. А вставать за пультом, также не хочется. (к примеру когда вечером ложимся спать) - ну и пульт получается только для включения-выключения.
3) Компьютер не выключается никогда.

Решение: Была написана небольшая программа на C#, которая при запуске просто отправляет монитор в сон. Код -

    class Program
    {
        [DllImport("user32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, 
                                         int msg, 
                                         IntPtr wParam, 
                                         IntPtr lParam);
 
        static void Main()
        {
            var hwndBroadcast  = (IntPtr)0xFFFF;
            var scMonitorpower = (IntPtr)0xF170;
            var wmSyscommand   = 0x0112;
 
            SendMessage(hwndBroadcast, wmSyscommand, scMonitorpower, (IntPtr)2);
        }
    }

Несколько примечаний -
1) Проект консольный, но "Output type" windows application - по этому никаких окон не появляется при запуске
2) Админских прав не требует
3) Никаких дополнительных библиотек не требует