Есть ли способ обнаружить состояние монитора в Windows (вкл. Или выкл.)?
Кто-нибудь знает, есть ли API для получения текущего состояния монитора (вкл. или выкл.) в Windows (XP/Vista/2000/2003)?
Все мои поиски, похоже, указывают, что нет реального способа сделать это.
Этот поток пытается использовать GetDevicePowerState, который согласно Документы Microsoft не работают для устройств отображения.
В Vista я могу слушать GUID_MONITOR_POWER_ON, но я, похоже, не получаю события, когда монитор выключен вручную.
В XP я могу подключиться к WM_SYSCOMMAND
SC_MONITORPOWER
, ища статус 2. Это работает только в ситуациях, когда система отключает питание.
Класс WMI Win32_DesktopMonitor
тоже не помогает.
Изменить. Здесь обсуждение на comp.os.ms-windows.programmer.win32, указывающее, что есть нет надежного способа сделать это.
У кого-нибудь есть другие идеи?
Ответы
Ответ 1
GetDevicePowerState иногда работает для мониторов. Если он присутствует, вы можете открыть устройство \\.\LCD. Закройте его сразу же после того, как вы закончите с ним.
По сути, вам не повезло - нет надежного способа определить состояние питания монитора, не записывая драйвер устройства и не фильтруя все мощные IRP вверх и вниз по цепочке драйверов дисплея. И это тоже не очень надежное.
Ответ 2
Вы можете подключить веб-камеру, указать ее на свой экран и провести анализ полученных изображений;)
Ответ 3
Прежде чем делать что-либо на основе состояния монитора, просто помните, что пользователи могут использовать машину с удаленным рабочим столом других систем, для которых не требуется монитор, подключенный к аппарату, - поэтому не выключайте визуализацию на основе монитора состояние.
Ответ 4
Вы не можете.
Посмотрите, как все возможности мощности монитора подключены к "безопасному энергопотреблению"
После поиска я нашел здесь код, связывающий сообщение SC_MONITORPOWER и системные значения (сообщение номер 2)
Я использую код для тестирования, если системные значения меняются, когда я вручную отключу монитор.
int main()
{
for(;monitorOff()!=1;)
Sleep(500);
return 0;
}//main
И код никогда не останавливается, независимо от того, как долго я отключу свой монитор.
Там код функции monitorOff:
int monitorOff()
{
const GUID MonitorClassGuid =
{0x4d36e96e, 0xe325, 0x11ce,
{0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}};
list<DevData> monitors;
ListDeviceClassData(&MonitorClassGuid, monitors);
list<DevData>::iterator it = monitors.begin(),
it_end = monitors.end();
for (; it != it_end; ++it)
{
const char *off_msg = "";
//it->PowerData.PD_PowerStateMapping
if (it->PowerData.PD_MostRecentPowerState != PowerDeviceD0)
{
return 1;
}
}//for
return 0;
}//monitorOff
Заключение:, когда вы вручную переключаете монитор, вы не можете его поймать окнами (если для этого нет необычного интерфейса драйвера), поскольку все возможности Windows подключен к "энергосберегающему режиму" .
Ответ 5
В Windows XP или более поздней версии вы можете использовать интерфейс IMSVidDevice.
См
http://msdn.microsoft.com/en-us/library/dd376775(VS.85).aspx
(не уверен, что это работает в Sever 2003)
Ответ 6
Если на вашем мониторе есть встроенный USB-концентратор, вы можете попробовать и использовать это, чтобы определить, выключен ли монитор.
Это, конечно, будет работать только в том случае, если концентратор USB не будет оставаться включенным, если монитор считается выключенным.
Ответ 7
С кодом Delphi вы можете обнаружить недопустимую геометрию монитора во время ожидания:
i := 0
('Monitor'+IntToStr(i)+': '+IntToStr(Screen.Monitors[i].BoundsRect.Left)+', '+
IntToStr(Screen.Monitors[i].BoundsRect.Top)+', '+
IntToStr(Screen.Monitors[i].BoundsRect.Right)+', '+
IntToStr(Screen.Monitors[i].BoundsRect.Bottom))
Результаты:
Мониторинг геометрии перед режимом ожидания:
Monitor0: 0, 0, 1600, 900
Мониторинг геометрии в режиме ожидания в Deplhi7:
Monitor0: 1637792, 4210405, 31266576, 1637696
Мониторинг геометрии в режиме ожидания в DeplhiXE:
Monitor0: 4211194, 40, 1637668, 1637693
Ответ 8
Это действительно старая должность, но если она может помочь кому-то, я нашел решение для обнаружения экрана, доступного или нет: API подключения и настройки дисплеев (CCD) Windows.
Это часть User32.ddl
, а интересными функциями являются GetDisplayConfigBufferSizes
и QueryDisplayConfig
. Он дает нам всю информацию, которая может быть просмотрена в окне конфигурации окон.
В частности, PathInfo
содержит свойство TargetInfo
, имеющее флаг targetAvailable
. Этот флаг, кажется, правильно обновлен во всех конфигурациях, которые я пробовал до сих пор.
Это позволяет вам знать состояние всех экранов, подключенных к ПК, и устанавливать их конфигурации.
Здесь CCD-обертка для. Net