Win32API 利用可能なモニター情報を列挙する EnumMonitors

利用可能なモニター情報を列挙するには、EnumMonitors関数を用いる。


EnumMonitors関数は、以下のように定義されている

BOOL EnumMonitors(
  LPTSTR pName,       // サーバー名へのポインタ(NULLを指定した場合、ローカルモニターが列挙される)
  DWORD Level,        // 構造体のレベル
  LPBYTE pMonitors,   // 構造体配列へのポインタ
  DWORD cbBuf,        // バッファのサイズ (バイト数)
  LPDWORD pcbNeeded,  // コピーされた (または必要な) バイト数を受け取る
                      // 変数のアドレス
  LPDWORD pcReturned  // コピーされたジョブ情報構造体の数を受け取る
                      // 変数のアドレス
);




第2引数Levelは、構造体のレベルを表している。Levelに「1」を指定した場合は、MONITOR_INFO_1構造体へのポインタを第3引数pMonitorsに指定し、「2」を指定した場合は、MONITOR_INFO_2構造体へのポインタを第3引数pMonitorsに指定する。

MONITOR_INFO_1構造体は、以下のように定義されている。

typedef struct _MONITOR_INFO_1 {
  LPTSTR pName;//モニターの名前
} MONITOR_INFO_1, *PMONITOR_INFO_1;


また、MONITOR_INFO_2構造体(MONITOR_INFO_2A構造体)は、以下のように定義されている。

typedef struct _MONITOR_INFO_2 {
  LPTSTR pName;//モニターの名前
  LPTSTR pEnvironment;//モニターの環境(例:Windows NT x86, Windows IA64, Windows x64)
  LPTSTR pDLLName;//モニターDLLの名前
} MONITOR_INFO_2, *PMONITOR_INFO_2;




  • 構造体レベルを1に指定した場合のEnumMonitors関数の使用例を以下に示す。
  • #include <windows.h>
    #include <winspool.h>
    #pragma comment(lib, "winspool.lib")
    
    int main()
    {
        MONITOR_INFO_1A *pInfo;
        DWORD dwNeeded;
        DWORD dwReturned;
        BYTE *lpBuffer;
        
        ::EnumMonitorsA(NULL,
            1,
            NULL,
            0,
            &dwNeeded,
            &dwReturned);
    
        lpBuffer = (LPBYTE)LocalAlloc(LPTR, dwNeeded);
        if (lpBuffer == NULL) {
            return 1;
        }
    
        ::EnumMonitorsA(NULL,
            1,
            lpBuffer,
            dwNeeded,
            &dwNeeded,
            &dwReturned);
    
        pInfo = (MONITOR_INFO_1A *)lpBuffer;
    
        puts(pInfo->pName);
    
        LocalFree(lpBuffer);
    
        return 0;
    }


    実行結果(拙者の実行環境にて)

    WSD Port




  • 構造体レベルを2に指定した場合のEnumMonitors関数の使用例を以下に示す。
  • #include <windows.h>
    #include <winspool.h>
    #pragma comment(lib, "winspool.lib")
    
    int main()
    {
        MONITOR_INFO_2A *pInfo;
        DWORD dwNeeded;
        DWORD dwReturned;
        BYTE *lpBuffer;
        
        ::EnumMonitorsA(NULL,
            2,
            NULL,
            0,
            &dwNeeded,
            &dwReturned);
    
        lpBuffer = (LPBYTE)LocalAlloc(LPTR, dwNeeded);
        if (lpBuffer == NULL) {
            return 1;
        }
    
        ::EnumMonitorsA(NULL,
            2,
            lpBuffer,
            dwNeeded,
            &dwNeeded,
            &dwReturned);
    
        pInfo = (MONITOR_INFO_2A *)lpBuffer;
    
        printf("Name: %s\n", pInfo->pName);
        printf("Environment: %s\n", pInfo->pEnvironment);
        printf("DLLName: %s\n", pInfo->pDLLName);
    
        LocalFree(lpBuffer);
    
        return 0;
    }


    実行結果(拙者の実行環境にて)

    Name: WSD Port
    Environment: Windows NT x86
    DLLName: WSDMon.dll





    参考
    EnumMonitors関数
    http://msdn.microsoft.com/ja-jp/library/cc428545.aspx


    MONITOR_INFO_1構造体
    http://msdn.microsoft.com/en-us/library/dd145067.aspx


    MONITOR_INFO_2構造体
    http://msdn.microsoft.com/en-us/library/dd145068.aspx