Загляните в этот блог здесь , который поможет вам сделать то, что вы пытаетесь достичь. Кроме того, вам нужно создать пользовательское событие, чтобы сделать это для вас примерно так:
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));
}
}
Изменить: Как Ману не был уверен, как получить события, это редактирование будет включать пример кода о том, как использовать этот класс, как показано ниже .
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 ... не стесняйтесь отбрасывать это понятие ...)
Если нет недокументированного API где-то встроенного и скрытого глубоко в программном драйвере Energy-Power (API действительно действительно срабатывает, когда нажатие кнопки «Power» отправляет этот сигнал на монитор, в котором действительно работает режим Power). активируйтесь в результате!) тогда, возможно, запустив поток в фоновом режиме указанного приложения формы, опросив его еще, неизвестную функциональность или API для проверки состояния питания - там должно быть что-то, о чем знает только Microsoft ... в конце концов, Energy Star показала Microsoft, как запустить режим энергосбережения на самом мониторе, конечно же, это не улица с односторонним движением? или это?
Извините, Ману, если я не смог помочь дальше ....: (
Правка # 2: Я подумал о том, что я написал ранее в редактировании, и немного покопался, пытаясь найти ответ, и думаю, что придумал ответ, но сначала возникла мысль в мою голову, посмотрите этот документ здесь - документ в формате pdf от 'terranovum.com', ключ (или я так думал ...) был в реестре, используя последние два ключа реестра на последнем страница документа содержит указанное смещение в число секунд, и в сочетании с этой статьей CodeProject , чтобы узнать время простоя, было бы легко определить, когда монитор переходит в режим ожидания, звучит просто или так я думал, Ману тоже не понравится это понятие ...
Дальнейшие исследования в Google привели меня к такому выводу. Ответ заключается в расширении спецификации VESA BIOS DPMS (Display Power Management Signaling), теперь вопрос, который возникает из-за это то, как вы запрашиваете эту сигнализацию в BIOS VESA, теперь многие современные видеокарты имеют встроенный VESA Bios, поэтому где-то должен быть аппаратный порт, где вы можете считывать значения выводов, используя Маршрут потребует использования InpOut32 или, если у вас 64-битная Windows, есть InpOut64 через pinvoke. В основном, если вы можете вспомнить, используя Turbo C или Turbo Pascal (оба 16-битные для DOS), была подпрограмма inport / outport или аналогичная для чтения аппаратного порта, или даже GWBASIC с использованием peek / poke. Если адрес аппаратного порта может быть найден, то значения можно запросить, чтобы определить, находится ли монитор в режиме ожидания / выключен / приостановлен / включен, проверяя горизонтальную синхронизацию и вертикальную синхронизацию, это, я думаю, является более надежным решением. ..
Извиняюсь за длинный ответ, но чувствовал, что должен записать свои мысли ...
Там все еще есть надежда, Ману :);)