2011-10-14 1 views
6

アクティブなディスプレイの数を数えたいと思います。 Macの場合、私は以下を使用することができます:ウィンドウの表示数を取得するにはどうすればよいですか?

CGDisplayCount nDisplays; 
CGGetActiveDisplayList(0,0, &nDisplays); 
log.printf("Displays connected: %d",(int)nDisplays); 

私はWindowsでどのようにすることができますか?私はEnumDisplayMonitorsを見つけましたが、私はそれをどのように使用するかを考え出すことはできません。

+2

MSDNのページでは、リンクされ、これを試してくださいEnumDisplayMonitors()を呼び出すの実例として


物理ディスプレイの数をカウントするためにGetSystemMetrics(SM_CMONITORS)を使用しています。それはあなたのために働くのですか? – IronMensan

答えて

19

あなたが発見したとおり、EnumDisplayMonitors()は仕事をしますが、電話するのはちょっと難しいです。ドキュメントの状態:

EnumDisplayMonitors関数は、指定されたクリッピング矩形の交点とデバイスコンテキストの可視領域によって形成された領域と交差(ミラーリングドライバに関連付けられた不可視擬似モニターを含む)を表示モニタを列挙する。 EnumDisplayMonitorsは、アプリケーション定義のMonitorEnumProcコールバック関数を、列挙されている各モニターに対して1回呼び出します。 GetSystemMetrics(SM_CMONITORS)は、ディスプレイモニタのみをカウントすることに注意してください。

これにより、わかりやすい解答が得られます。GetSystemMetrics(SM_CMONITORS)。確かに、擬似モニタをお持ちの場合はEnumDisplayMonitors()よりも優れているかもしれません。

BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) 
{ 
    int *Count = (int*)dwData; 
    (*Count)++; 
    return TRUE; 
} 

int MonitorCount() 
{ 
    int Count = 0; 
    if (EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, (LPARAM)&Count)) 
     return Count; 
    return -1;//signals an error 
} 
+0

これは私のために32ビットでのみ動作します... 64ビットで作業するためのトリックはありますか? – alap

+4

64ビットで正常に動作するはずです。あなたが実際に「うまくいく」ことについてもっと多くの情報を提供しない限り、誰にでも助けになることは非常に難しいです。 –

+0

申し訳ありません。私は同じコードを使用し、 "win32"でコンパイルすると動作しますが、x64は動作しません。しかし、私はポイントを持っています。 – alap

2

テストしますが、基本的にあなただけの列挙機能のためのコールバックを提供する必要がない:

int numMonitors = 0; 

BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) 
    { 
    //lprcMonitor holds the rectangle that describes the monitor position and resolution) 

    numMonitors++; 
    return true; 
    } 

int main() 
    { 
    EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, NULL); 
    } 
関連する問題