EnumDisplayDevices по сравнению с WMI Win32_DesktopMonitor, как обнаружить активные мониторы?

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

Чтобы исправить проблему, вам нужно сохранить результат, возвращенный функцией:

def earthConverter(latitude, longitude, height):
    ...
    return x, y, z

x,y,z = earthConverter(123.0256, 56.45648, 21322.4545)
print('x is %f' % x)
9
задан tzot 15 October 2008 в 15:39
поделиться

4 ответа

Это - мой текущий происходящий работой код для обнаружения идентификатора устройства мониторинга, надежно.

CString DeviceID;
DISPLAY_DEVICE dd; 
dd.cb = sizeof(dd); 
DWORD dev = 0; 
// device index 
int id = 1; 
// monitor number, as used by Display Properties > Settings

while (EnumDisplayDevices(0, dev, &dd, 0))
{
    DISPLAY_DEVICE ddMon;
    ZeroMemory(&ddMon, sizeof(ddMon));
    ddMon.cb = sizeof(ddMon);
    DWORD devMon = 0;

    while (EnumDisplayDevices(dd.DeviceName, devMon, &ddMon, 0))
    {
        if (ddMon.StateFlags & DISPLAY_DEVICE_ACTIVE && 
                     !(ddMon.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER))
        {
            DeviceID.Format (L"%s", ddMon.DeviceID);
            DeviceID = DeviceID.Mid (8, DeviceID.Find (L"\\", 9) - 8);
        }
        devMon++;

        ZeroMemory(&ddMon, sizeof(ddMon));
        ddMon.cb = sizeof(ddMon);
    }

    ZeroMemory(&dd, sizeof(dd));
    dd.cb = sizeof(dd);
    dev++; 
}
10
ответ дан 4 December 2019 в 15:28
поделиться

Мы играли с EnumDisplayDevices, чтобы обнаружить, если текущим производителем видеокарт является NVIDIA. Это не то же, но возможно это помогло бы. Наша часть была похожа на это:

int disp_num = 0;
    BOOL res = TRUE;
    do {
        DISPLAY_DEVICE disp_dev_info; 
        ZeroMemory( &disp_dev_info, sizeof(DISPLAY_DEVICE) );
        disp_dev_info.cb = sizeof(DISPLAY_DEVICE);
        res = EnumDisplayDevices( 0, disp_num++, &disp_dev_info, 0x00000001 );
        if(res &&
           disp_dev_info.DeviceString[0]!=0 && disp_dev_info.DeviceString[0]=='N' &&
           disp_dev_info.DeviceString[1]!=0 && disp_dev_info.DeviceString[1]=='V' && 
           disp_dev_info.DeviceString[2]!=0 && disp_dev_info.DeviceString[2]=='I' && 
           disp_dev_info.DeviceString[3]!=0 && disp_dev_info.DeviceString[3]=='D' && 
           disp_dev_info.DeviceString[4]!=0 && disp_dev_info.DeviceString[4]=='I' && 
           disp_dev_info.DeviceString[5]!=0 && disp_dev_info.DeviceString[5]=='A'){
            isNVidia = true;
        }
        int x = 0;
    }while( res != FALSE );

Довольно немой, но работа.

1
ответ дан 4 December 2019 в 15:28
поделиться

Я никогда не пытался делать его от сервиса, но EnumDisplayDevices обычно работы хорошо, когда выполнено как пользователь. Я полагаю, что услуги работают в отдельном (и бездисплейный) сессия, которая могла объяснить проблему, которую Вы видите там.

Вы могли запустить программу помощника от своего сервиса, явившись олицетворением учетной записи пользователя, которая имеет доступ к дисплеям?

0
ответ дан 4 December 2019 в 15:28
поделиться

Метод Win32_DesktopMonitor только возвращает 1 монитор на моей машине Vista также. Идентификатор PnP, кажется, установлен правильно, все же.

У меня была быстрая игра с EnumDisplayDevices API, и в то время как это, кажется, обнаруживает детали адаптера надежно (по-видимому, потому что большинство людей не будет оставлять его как "Стандарт VGA" долгое время), это только возвращает "Монитор Plug and Play" для подключенных мониторов.

Это повторяет исследование, которое я провел в это несколько лет назад (должен был соединить некоторый код для помощи в стирании тех памятей).

Это из учетной записи обычного пользователя. Если у Вас есть надежный способ заставить EnumDisplayDevices возвращать идентификатор PnP, даже на сессиях обычного пользователя, мне было бы интересно - мы в настоящее время занимаемся расследованиями, если какая-либо эта информация доступна драйверу устройства.

Одна вещь, которую Вы могли сделать при выполнении кода от сессии № 0, не достаточно надежна, должен видеть, можно ли породить процесс помощника (или использование CreateProcessAsUser или использование COM с моникерами активации), это будет работать в контексте пользователя.

0
ответ дан 4 December 2019 в 15:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: