Como detectar se um monitor widescreen no Windows
-
16-09-2019 - |
Pergunta
Eu preciso de uma maneira de programaticamente detectar se o monitor é grande ou não, no Windows.
GetSystemMetrics retorna o tamanho da área de trabalho, que tipo de obras, mas se um usuário tem um monitor widescreen, digamos, 1024x768, vou incorretamente classificá-lo como não-largura.
GetDeviceCaps tem problemas semelhantes com HORZRES e VERTRES, e até mesmo HORZSIZE E VERTSIZE dar resultados incorretos quando um não-wide resolução é usado em uma ampla monitor.
Existe alguma maneira de detectar isso de forma confiável?
Solução
Você pode ser capaz de obter o tamanho físico real através EDID . Veja aqui: Como obter o correto tamanho físico do monitor?
Outras dicas
Aqui está uma versão melhor que não mexer com o EDID ou o registro. Ele faz a suposição (que é IMHO muito preciso), a resolução máxima suportada pela tela é o melhor ajuste nativa.
DEVMODEA modeInfo;
modeInfo.dmSize = sizeof(DEVMODEA);
modeInfo.dmDriverExtra = NULL;
int modeNum = 0;
int xMax = 0, yMax = 0;
while (EnumDisplaySettingsExA(0, modeNum, &modeInfo, 0)) {
++modeNum;
if (modeInfo.dmPelsWidth > xMax) {
xMax = modeInfo.dmPelsWidth;
yMax = modeInfo.dmPelsHeight;
}
}
cout << "Monitor aspect ratio : " << (double)xMax/yMax << "\n";
Felicidades.
tentar SystemInformation.PrimaryMonitorSize
A coisa sensata seria monitores Classificar por largura e altura proporção. Isso é o que eu vejo um monte de jogos que fazem estes dias.
Se você pode obter a largura, então provavelmente você pode obter a altura. Depois disso, a resposta é apenas uma pequena operação matemática de distância.