Ответ 1
Взгляните на этот блог здесь, который поможет вам сделать то, что вы пытаетесь достичь. Кроме того, вам нужно сделать собственное событие, чтобы сделать это для вас примерно так:
public enum PowerMgmt{
StandBy,
Off,
On
};
public class ScreenPowerMgmtEventArgs{
private PowerMgmt _PowerStatus;
public ScreenPowerMgmtEventArgs(PowerMgmt powerStat){
this._PowerStatus = powerStat;
}
public PowerMgmt PowerStatus{
get{ return this._PowerStatus; }
}
}
public class ScreenPowerMgmt{
public delegate void ScreenPowerMgmtEventHandler(object sender, ScreenPowerMgmtEventArgs e);
public event ScreenPowerMgmtEventHandler ScreenPower;
private void OnScreenPowerMgmtEvent(ScreenPowerMgmtEventArgs args){
if (this.ScreenPower != null) this.ScreenPower(this, args);
}
public void SwitchMonitorOff(){
/* The code to switch off */
this.OnScreenPowerMgmtEvent(new ScreenPowerMgmtEventArgs(PowerMgmt.Off));
}
public void SwitchMonitorOn(){
/* The code to switch on */
this.OnScreenPowerMgmtEvent(new ScreenPowerMgmtEventArgs(PowerMgmt.On));
}
public void SwitchMonitorStandby(){
/* The code to switch standby */
this.OnScreenPowerMgmtEvent(new ScreenPowerMgmtEventArgs(PowerMgmt.StandBy));
}
}
Изменить: Поскольку Manu не был уверен, как получить события, это изменение будет включать пример кода о том, как использовать этот класс, как показано ниже.
Using System;
Using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.Interop;
using System.Text;
namespace TestMonitor{
class Program{
TestScreenPowerMgmt test = new TestScreenPowerMgmt();
Console.WriteLine("Press a key to continue...");
Console.ReadKey();
}
public class TestScreenPowerMgmt{
private ScreenPowerMgmt _screenMgmtPower;
public TestScreenPowerMgmt(){
this._screenMgmtPower = new ScreenPowerMgmt;
this._screenMgmtPower.ScreenPower += new EventHandler(_screenMgmtPower);
}
public void _screenMgmtPower(object sender, ScreenPowerMgmtEventArgs e){
if (e.PowerStatus == PowerMgmt.StandBy) Console.WriteLine("StandBy Event!");
if (e.PowerStatus == PowerMgmt.Off) Console.WriteLine("Off Event!");
if (e.PowerStatus == PowerMgmt.On) Console.WriteLine("On Event!");
}
}
}
Посмотрев на этот код и понимая, что что-то не совсем правильно, мне стало ясно, что Ману ищет способ опросить систему, чтобы обнаружить статус питания монитора, который недоступен, но код показывает, что программным способом монитор можно включить/выключить/включить, одновременно инициируя событие, но он хотел, чтобы он мог подключиться к WndProc
формы и обработать сообщение, указывающее состояние монитора... Теперь, в этот момент, я собираюсь высказать свое мнение по этому поводу.
Я не уверен на 100%, если это можно сделать или Windows действительно отправляет широковещательное сообщение с надписью "Эй! Монитор собирается спать 'или' Эй! Монитор активируется", я боюсь сказать, что мониторы фактически не посылают какой-либо программный сигнал в Windows, чтобы сообщить, что он будет спать/выключен/включен. Теперь, если у кого есть предложения, подсказки, подсказки об этом, не стесняйтесь публиковать свой комментарий...
Программное обеспечение Energy Star как часть вкладки ScreenSaver, которое можно найти при щелчке правой кнопкой мыши на рабочем столе в любом месте, появится всплывающее меню, щелкните левой кнопкой мыши по "Свойствам", появится диалоговое окно "Дисплей" с разными, щелкните левой кнопкой мыши на "ScreenSaver", нажмите кнопку "Power" как часть блока группировки "Monitor Power", эта часть диалогового окна каким-то образом запускает подсистему Windows (драйвер видеокарты? /Energy Star?) для отправьте аппаратный сигнал, чтобы включить функциональность энергосбережения самого монитора... (Мониторы, которые новенькие, не имеют этого по умолчанию AFAIK... не стесняйтесь отклонить это понятие...)
Если не существует документа с недокументированными документами, где-то встроенный и заглубленный глубоко в программном обеспечении Energy-Power (API, безусловно, действительно вызван тем, как нажатие кнопки "Питание" посылает этот сигнал на монитор, в котором режим питания действительно активируйте в результате!), а затем, возможно, запустив поток на фоне указанного приложения формы, опросив, чтобы допросить, что еще неизвестная функциональность или API для проверки состояния питания - должно быть что-то там, о котором знает только Microsoft... в конце концов, Energy Star показала Microsoft, как вызвать режим энергосбережения на самом мониторе, конечно же, это не улица с односторонним движением? или это?
Извините Ману, если я не смог бы помочь дальше....: (
Редактировать # 2: Я подумал о том, что написал ранее в своем редактировании, и немного поработал с корнем для ответа, и я думаю, что придумал ответ, но сначала подумал выскочил в голову, см. этот документ здесь - документ в формате pdf от "terranovum.com", ключ (или так я думал... ) был в реестре, используя последние два раздела реестра на последней странице документа, содержит указанное смещение в количестве секунд и в сочетании с этим CodeProject, чтобы узнать время простоя, было бы легко определить, когда монитор переходит в режим ожидания, звучит просто или так, как я думал, Ману не понравится это понятие....
Дальнейшие исследования с google приводят меня к такому выводу, ответ заключается в расширении спецификации VESA BIOS DPMS (Display Power Management Signaling), теперь возникает вопрос, который возникает из-за этого, как вы допрашиваете эту сигнализацию на биосе VESA, а теперь много современных графических карт что VESA Bios встроен в него, поэтому там должен быть аппаратный порт где-нибудь, где вы можете прочитать значения контактов, используя этот маршрут, потребуется использование InpOut32 или если у вас есть 64-битная Windows, там InpOut64через pinvoke. В принципе, если вы можете вспомнить, используя Turbo C или Turbo Pascal (как 16-бит для DOS), была обычная программа, называемая inport/outport или аналогичная для чтения аппаратного порта, или даже GWBASIC с использованием peek/poke. Если адрес аппаратного порта можно найти, то значения могут быть опрошены, чтобы определить, находится ли монитор в режиме ожидания/выключен/приостановлен/включен, проверяя горизонтальную синхронизацию и вертикальную синхронизацию, это, я думаю, является более надежным решением...
Извиняюсь за длинный ответ, но почувствовал, что мне приходится записывать свои мысли...
Там все еще надеюсь, что Manu:);)