Есть ли способ определить состояние монитора в Windows (включено или выключено)? - PullRequest
18 голосов
/ 15 октября 2008

Кто-нибудь знает, есть ли 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, указывающее, что нет надежного способа сделать это.

У кого-нибудь еще есть другие идеи?

Ответы [ 8 ]

12 голосов
/ 05 марта 2009

Вы можете подключить веб-камеру, навести ее на экран и провести анализ полученных изображений;)

12 голосов
/ 15 октября 2008

GetDevicePowerState иногда работает для мониторов. Если он присутствует, вы можете открыть устройство \\.\LCD. Закройте его сразу после того, как закончите.

По сути, вам не повезло - не существует надежного способа определения состояния питания монитора, кроме написания драйвера устройства и фильтрации всех IRP питания вверх и вниз по цепочке драйверов дисплея. И это тоже не очень надежно.

7 голосов
/ 15 октября 2008

Прежде чем что-либо делать в зависимости от состояния монитора, просто помните, что пользователи могут использовать машину с удаленным рабочим столом других систем, для которых не требуется монитор, подключенный к машине, поэтому не отключайте визуализацию на основе монитора состояние.

6 голосов
/ 05 марта 2009

Вы не можете.

Похоже, что все возможности питания монитора подключены к «безопасному режиму питания»
После поиска я нашел здесь код, соединяющий сообщение 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 (если для этого нет необычного интерфейса драйвера), потому что все возможности Windows подключены «безопасный режим питания» .

2 голосов
/ 09 марта 2009

В Windows XP или более поздней версии вы можете использовать интерфейс IMSVidDevice.

См http://msdn.microsoft.com/en-us/library/dd376775(VS.85).aspx

(не уверен, работает ли это в Sever 2003)

0 голосов
/ 07 июля 2016

Это действительно старая публикация, но если она может кому-то помочь, я нашел решение для определения доступности экрана: API подключения и настройки дисплеев (CCD) для Windows.

Это часть User32.ddl, и интересными функциями являются GetDisplayConfigBufferSizes и QueryDisplayConfig. Это дает нам всю информацию, которую можно просмотреть на панели конфигурации Windows.

В частности, PathInfo содержит свойство TargetInfo с флагом targetAvailable. Этот флаг корректно обновляется во всех конфигурациях, которые я пробовал до сих пор.

Это позволяет узнать состояние всех экранов, подключенных к ПК, и настроить их конфигурации.

Здесь оболочка CCD для .Net

0 голосов
/ 03 мая 2016

С помощью кода 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
0 голосов
/ 16 апреля 2014

Если у вашего монитора есть какой-то встроенный USB-концентратор, вы можете попробовать и использовать его, чтобы определить, включен ли монитор.
Конечно, это будет работать только в том случае, если USB-концентратор не остается подключенным, когда монитор считается выключенным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...