Sau khi xem xét một số thông tin khác, tôi đã gặp phải chức năng GDI cũ EnumDisplaySettings
, cho phép tôi truy cập vào độ phân giải và tỷ lệ làm mới hiện tại. Kết hợp điều này với các chức năng IDXGIOutput::FindClosestMatchingMode
tôi có thể nhận được khá gần với chế độ hiển thị hiện tại:
void getClosestDisplayModeToCurrent(IDXGIOutput* output, DXGI_MODE_DESC* outCurrentDisplayMode)
{
DXGI_OUTPUT_DESC outputDesc;
output->GetDesc(&outputDesc);
HMONITOR hMonitor = outputDesc.Monitor;
MONITORINFOEX monitorInfo;
monitorInfo.cbSize = sizeof(MONITORINFOEX);
GetMonitorInfo(hMonitor, &monitorInfo);
DEVMODE devMode;
devMode.dmSize = sizeof(DEVMODE);
devMode.dmDriverExtra = 0;
EnumDisplaySettings(monitorInfo.szDevice, ENUM_CURRENT_SETTINGS, &devMode);
DXGI_MODE_DESC current;
current.Width = devMode.dmPelsWidth;
current.Height = devMode.dmPelsHeight;
bool useDefaultRefreshRate = 1 == devMode.dmDisplayFrequency || 0 == devMode.dmDisplayFrequency;
current.RefreshRate.Numerator = useDefaultRefreshRate ? 0 : devMode.dmDisplayFrequency;
current.RefreshRate.Denominator = useDefaultRefreshRate ? 0 : 1;
current.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
current.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
current.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
output->FindClosestMatchingMode(¤t, outCurrentDisplayMode, NULL);
}
... Nhưng tôi không nghĩ rằng đây thực sự là câu trả lời đúng vì tôi cần phải sử dụng chức năng di sản. Có cách nào để làm điều này với DXGI để có được chế độ hiển thị chính xác hiện tại hơn là sử dụng phương pháp này?
Nguồn
2013-03-31 00:27:30
Rất tiếc, tôi không tìm kiếm chế độ hiển thị _current_, không phải danh sách _available_ chế độ hiển thị. Nhưng nhìn vào mã nguồn của liên kết mà bạn cung cấp đã dẫn tôi đến một tập hợp các chức năng Windows khác có thể giúp tôi chuyển sang chế độ hiển thị hiện tại ... –