簡體   English   中英

如何檢測當前屏幕分辨率?

[英]How to detect the current screen resolution?

我如何從 Winapi(在 C 或 C++ 中)檢測當前的屏幕分辨率?

一些背景:

我想啟動一個新的 OpenGL 全屏窗口,但希望它以桌面已設置的相同水平和垂直大小打開。 (現在每個人都使用 LCD 屏幕時,我認為這是獲得屏幕原始分辨率的最佳方法。)

我並不迫切需要知道桌面顏色深度,盡管這將是一個不錯的獎勵。

  • 主監視器的大小: GetSystemMetrics SM_CXSCREEN / SM_CYSCREEN(也可以使用 GetDeviceCaps)
  • 所有監視器的大小(組合):GetSystemMetrics SM_CX/YVIRTUALSCREEN
  • 主監視器上的工作區大小(屏幕不包括任務欄和其他停靠欄): SystemParametersInfo SPI_GETWORKAREA
  • 特定監視器的大小(工作區和“屏幕”): GetMonitorInfo

編輯:重要的是要記住,監視器並不總是從 0x0“開始”,因此僅知道大小不足以定位您的窗口。 您可以使用 MonitorFromWindow 查找您的窗口所在的監視器,然后調用 GetMonitorInfo

如果您想走低級路線或更改分辨率,則需要使用 EnumDisplayDevices、EnumDisplaySettings 和 ChangeDisplaySettings(這是獲得刷新率 AFAIK 的唯一方法,但 GetDeviceCaps 會告訴您顏色深度)

當系統使用DPI 虛擬化(Vista 及以上)時,使用 GetSystemMetrics 或 GetWindowRect 將無法獲得真實的屏幕分辨率(您將獲得虛擬分辨率),除非您創建了DPI Aware Application

所以這里最好的選擇(簡單且向后兼容)是將EnumDisplaySettings與 ENUM_CURRENT_SETTINGS 一起使用。

它是帶有這些參數的GetSystemMetrics
SM_CXSCREEN < 寬度
SM_CYSCREEN < 高度

正如它所說的(SM_CXSCREEN):

主顯示器的屏幕寬度,以像素為單位。 這與通過調用 GetDeviceCaps 獲得的值相同,如下所示:GetDeviceCaps(hdcPrimaryMonitor, HORZRES)。

我認為SystemParametersInfo可能有用。

編輯:也看看GetMonitorInfo

MFC 示例 使用 GetSystemMetrics EnumDisplayMonitors 和 GetMonitorInfo 支持多監視器

按照此鏈接: 使用源代碼監視枚舉

大約一周前刪除,然后編輯 3-4-13。

對於用戶決定以較低分辨率(壞主意)運行桌面的情況或人們決定獲得其圖形控制器無法充分利用的顯示器的極端情況,這是一個很好的方法:

// get actual size of desktop
RECT actualDesktop;
GetWindowRect(GetDesktopWindow(), &actualDesktop);

我使用 GetSystemMetrics 函數

GetSystemMetrics(SM_CXSCREEN) 返回屏幕寬度(以像素為單位)

GetSystemMetrics(SM_CYSCREEN) - 以像素為單位的高度

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724385%28v=vs.85%29.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM