- /*
- 下面的例子说明了如何使用函数EnumDisplayDevice获得显示器的信息.
- */
- BOOL GetDisplayMonitorInfo(int nDeviceIndex, LPSTR lpszMonitorInfo)
- {
- FARPROC EnumDisplayDevices;
- HINSTANCE hInstUser32;
- DISPLAY_DEVICE DispDev;
- char szSaveDeviceName[33]; // 32 + 1 for the null-terminator
- BOOL bRet = TRUE;
- HRESULT hr;
- hInstUser32 = LoadLibrary("c://windows/User32.DLL");
- if (!hInstUser32) return FALSE;
- //获取函数的入口地址
- EnumDisplayDevices = (FARPROC)GetProcAddress(hInstUser32,"EnumDisplayDevicesA");
- if (!EnumDisplayDevices)
- {
- FreeLibrary(hInstUser32);
- return FALSE;
- }
- //通过宏来填充一个结构体
- ZeroMemory(&DispDev, sizeof(DispDev));
- DispDev.cb = sizeof(DispDev);
- // 首次调用EnumDisplayDevice之后,DispDev.DeviceString中保存的是适配器
- //的名称
- if (EnumDisplayDevices(NULL, nDeviceIndex, &DispDev, 0))
- {
- //字符串的复制,通过此函数的第二个参数设置要复制的数据的长度可以
- //确保复制的过程数据不越界
- hr = StringCchCopy(szSaveDeviceName, 33, DispDev.DeviceName);
- //这里用来检查复制是否成功,检查的方式是使用宏SUCCEED和FAILED
- if (FAILED(hr))
- {
- /*
- #define SUCCEEDED(Status) ((HRESULT)(Status) >= 0)
- #define FAILED(Status) ((HRESULT)(Status)<0)
- HRESULT其实就是LONG型,如此看来FAILED的意思就是其检查的值小于0,
- SUCCESSED的意思就是其检查的值不小于0.
- */
- // TODO: write error handler
- }
- // 通过第二次调用EnumDisplayDevices,并且第一个参数设置成适配器的名称,
- //DispDev.DeviceString中保存的便是显示器的名称了.
- EnumDisplayDevices(szSaveDeviceName, 0, &DispDev, 0);
- //在下面的操作中,必须确保lpszMonitorInfo长度为129个字节且以0结尾
- hr = StringCchCopy(lpszMonitorInfo, 129, DispDev.DeviceString);
- if (FAILED(hr))
- {
- // TODO: write error handler
- }
- }
- else
- {
- bRet = FALSE;
- }
- FreeLibrary(hInstUser32);
- return bRet;
- }