2014-02-23 4 views
2

Моя задача состоит в том, чтобы подсчитать количество текущих мониторов (экранов), подключенных к компьютеру, на котором мой пользовательский код режима ниже работает:выпуск перечисляя мониторов в Windows,

int nCnt = 0; 
if(!EnumDisplayMonitors(NULL, NULL, countMonitorsProc, (LPARAM)&nCnt)) 
{ 
    //Error 
} 

BOOL countMonitorsProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) 
{ 
    int* pCnt = (int*)dwData; 
    (*pCnt)++; 

    return TRUE; 
} 

Он работает в большинстве случаев, но на некоторые системы EnumDisplayMonitors возвращает FALSE. Пример такой системы: мой ноутбук, где я подключил внешний монитор и закрыл крышку.

Мне любопытно, я использую правильный подход для подсчета прилагаемых мониторов?

+1

Что 'GetLastError()' вернуть? – alk

+1

Пожалуйста, не помещайте ненужные теги в заголовок - вот для чего предназначен раздел тегов. Спасибо :) – slugster

+0

@alk: Согласно MSDN, 'GetLastError' не используется для этого API. – c00000fd

ответ

0

Если вы хотите знать, сколько мониторов подключено, не нужно звонить EnumDisplayMonitors. Правильный способ сделать это для физических (не виртуальных) мониторов - через GetSystemMetrics, с индексом SM_CMONITORS.

 
SM_CMONITORS   The number of display monitors on a desktop. For more 
80     information, see the Remarks section in this topic. 

В разделе Примечания

GetSystemMetrics (SM_CMONITORS) подсчитывает только видимые мониторы дисплея. Это отличается от EnumDisplayMonitors, который перечисляет как видимые мониторы отображения, так и невидимые псевдомониторы, которые связаны с драйверами зеркалирования. Невидимый псевдомонитор связан с псевдо-устройством, используемым для зеркалирования чертежа приложения для удаленных операций или других целей.

Вызов затем становится просто

nCnt = GetSystemMetrics(SM_CMONITORS); 
Смежные вопросы