如何从Winapi(在C或C++中)检测当前的屏幕分辨率?
一些背景:
我想开始一个新的OpenGL全屏窗口,但希望它以桌面已经设置的相同水平和垂直大小打开.(现在当每个人都使用LCD屏幕时,我认为这是获得屏幕原始分辨率的最佳方式.)
我并不急需知道桌面颜色深度,虽然这将是一个很好的奖励.
如何从hWnd获得显示器屏幕分辨率?
我正在使用hWnd,因为窗口可以位于多个监视器中的任何一个上.
即hWnd顶部/左侧坐标位于屏幕分辨率为800 x 600的显示器上.
我用一种名为PL/B的语言编程,它允许调用Windows API.
可以使用哪些Window API?
我正在尝试使用 EnumDisplayMonitors 创建每个监视器的动态数组并存储 DISPLAY_DEVICE 结构。为什么下面的代码不正确?
BOOL CALLBACK MyInfoEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) {
MONITORINFOEX iMonitor;
iMonitor.cbSize = sizeof(MONITORINFOEX);
GetMonitorInfo(hMonitor, &iMonitor);
if (iMonitor.dwFlags == DISPLAY_DEVICE_MIRRORING_DRIVER)
{
return true;
}
else
{
*reinterpret_cast<ScreenArray*>(dwData) = ScreenArray(&iMonitor);
return true;
};
}
Run Code Online (Sandbox Code Playgroud)
调用使用
ScreenArray monitorArray[15];
int i = 0;
EnumDisplayMonitors(NULL, NULL, MyInfoEnumProc, reinterpret_cast<LPARAM>(&monitorArray[i++]));
Run Code Online (Sandbox Code Playgroud)
数组中的第一个 (monitorArray[0]) 为第二个监视器返回正确的信息,但 monitorArray[1] 是最大值。
编辑:已解决我使用的方法只是实现我创建的函数:
MonitorArray *mA = reinterpret_cast<MonitorArray*>(dwData);
mA->addScreen(&iMonitor);
Run Code Online (Sandbox Code Playgroud)