次のコメント付きコードは、VS2010 SP1 (VC10) で動作するようです。
EnumMonitors()
APIの呼び出し方法については、コメントに従ってください。
基本的に、最初の呼び出しでは出力バッファ サイズを要求し、ゼロに設定して呼び出します。EnumMonitors()
cbBuf
次に、std::vector
を適切な出力バッファ サイズで適切にサイズ設定し、( を使用して) ベクトルの最初のバイトのアドレスをstd::vector::data()
の 2 番目の呼び出しに渡し、出力バッファを構造体EnumMonitors()
で埋めます。MONITOR_INFO_1
(成功パスと失敗例外スローパスの両方で、関数の終了時に割り当てられたメモリstd::vector
を自動的に解放することに注意してください。)
#include <exception> // for std::exception
#include <iostream> // for std::wcout, std::wcerr, std::endl
#include <sstream> // for std::ostringstream
#include <stdexcept> // for std::runtime_error
#include <vector> // for std::vector
#include <windows.h> // Win32 SDK main header
#include <winspool.h> // for EnumMonitors()
using namespace std;
void ThrowOnApiFailure(const char* apiName, DWORD errorCode)
{
ostringstream errorMessage;
errorMessage << apiName << "() failed with error code " << errorCode;
throw runtime_error(errorMessage.str());
}
void PrintMonitors()
{
static const int kMonitorInfoLevel = 1; // for MONITOR_INFO_1
// Ask output buffer size
DWORD bufferSize = 0;
DWORD infoCount = 0;
::EnumMonitors(
nullptr,
kMonitorInfoLevel,
nullptr,
0, // ask buffer size
&bufferSize,
&infoCount);
DWORD error = ::GetLastError();
if (error != ERROR_INSUFFICIENT_BUFFER)
{
ThrowOnApiFailure("EnumMonitors", error);
}
// Size output buffer
vector<BYTE> buffer(bufferSize);
// Fill buffer with monitor info
if ( ! ::EnumMonitors(
nullptr,
kMonitorInfoLevel,
buffer.data(),
buffer.size(),
&bufferSize,
&infoCount
) )
{
error = ::GetLastError();
ThrowOnApiFailure("EnumMonitors", error);
}
// Print monitor info
const MONITOR_INFO_1 * monitorInfo =
reinterpret_cast<const MONITOR_INFO_1*>(buffer.data());
for (DWORD i = 0; i < infoCount; i++)
{
wcout << monitorInfo[i].pName << endl;
}
}
int main()
{
try
{
PrintMonitors();
}
catch(const exception& e)
{
wcerr << "\n*** ERROR: " << e.what() << endl;
}
}