Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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 подключен к "энергосберегающему режиму" .

Ответ 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