屏幕分辨率是桌面程序开发中比较常见的一项系统信息。对于使用易语言开发的窗口程序、屏幕工具、桌面辅助软件以及需要进行界面自适应的应用来说,准确获取当前显示器的宽度和高度,可以为窗口定位、界面缩放、坐标计算等功能提供基础数据。
易语言读取屏幕分辨率主要有两种思路:一种是直接调用易语言环境提供的相关系统信息接口,另一种是通过 Windows API 获取屏幕尺寸。实际开发时,选择哪种方式取决于程序的复杂程度以及是否需要兼容多显示器、DPI 缩放等场景。
一、屏幕分辨率到底是什么
通常所说的屏幕分辨率,是指显示区域在水平方向和垂直方向上的像素数量。例如:
1920 × 1080 2560 × 1440 3840 × 2160
其中第一个数字表示屏幕宽度,第二个数字表示屏幕高度。
例如当前电脑使用的是 1920×1080 分辨率,那么:
屏幕宽度 = 1920 屏幕高度 = 1080
需要注意的是,屏幕分辨率与程序实际获得的桌面坐标范围并不一定完全等价。Windows 的 DPI 缩放、远程桌面环境、多显示器布局等因素,都可能影响程序对屏幕尺寸的判断。
二、使用易语言系统功能读取屏幕尺寸
对于普通的易语言桌面程序,如果只是希望获得当前主显示器的宽度和高度,可以优先考虑易语言提供的系统相关功能。
示例代码可以按照下面的思路编写:
.版本 2 .局部变量 屏幕宽度, 整数型 .局部变量 屏幕高度, 整数型 屏幕宽度 = 取屏幕宽度 () 屏幕高度 = 取屏幕高度 () 调试输出 (“屏幕宽度:” + 到文本 (屏幕宽度)) 调试输出 (“屏幕高度:” + 到文本 (屏幕高度))
不同版本的易语言支持库或开发环境中,相关命令名称可能存在差异。如果当前环境没有对应的直接命令,可以采用 Windows API 的方式实现。
这种方式的优势是代码简单,适合刚开始学习易语言或者只需要实现基础屏幕检测的程序。
三、通过 Windows API 获取屏幕分辨率
Windows 本身提供了多个用于获取显示设备尺寸的 API,其中 GetSystemMetrics 是比较常见的一种方法。
核心思路是调用:
GetSystemMetrics
然后分别传入对应的系统指标。
获取主屏幕宽度时使用:
SM_CXSCREEN
获取主屏幕高度时使用:
SM_CYSCREEN
在 Windows API 中,这两个常量通常分别对应:
SM_CXSCREEN = 0 SM_CYSCREEN = 1
因此实际逻辑可以理解为:
屏幕宽度 = GetSystemMetrics (0) 屏幕高度 = GetSystemMetrics (1)
在易语言中,可以先声明 Windows API:
.版本 2 .DLL命令 GetSystemMetrics, 整数型, "user32.dll", "GetSystemMetrics", 公开, 获取系统度量值 .参数 nIndex, 整数型
然后调用:
.局部变量 宽度, 整数型 .局部变量 高度, 整数型 宽度 = GetSystemMetrics (0) 高度 = GetSystemMetrics (1) 调试输出 (“当前屏幕分辨率:” + 到文本 (宽度) + “ × ” + 到文本 (高度))
假设系统当前主显示器为 1920×1080,最终得到的结果就是:
当前屏幕分辨率:1920 × 1080
四、完整的易语言示例
如果希望将读取功能封装起来,可以设计一个简单的子程序,让其他功能直接调用。
.版本 2 .DLL命令 GetSystemMetrics, 整数型, "user32.dll", "GetSystemMetrics", 公开 .参数 nIndex, 整数型 .子程序 获取屏幕分辨率 .局部变量 宽度, 整数型 .局部变量 高度, 整数型 宽度 = GetSystemMetrics (0) 高度 = GetSystemMetrics (1) 调试输出 (“屏幕宽度:” + 到文本 (宽度)) 调试输出 (“屏幕高度:” + 到文本 (高度))
程序启动后调用:
获取屏幕分辨率 ()
即可完成基本的屏幕尺寸检测。
这种封装方式比把 API 调用代码直接散落在多个事件中更加合理。以后需要增加 DPI 检测、多显示器处理或者分辨率判断时,也可以继续扩展这个子程序。
五、根据分辨率调整窗口大小
获取屏幕分辨率最常见的用途之一,就是让程序根据用户电脑的屏幕尺寸自动设置窗口大小。
例如,希望窗口默认占据屏幕宽度的 80%,高度占据屏幕高度的 70%,可以进行简单计算:
窗口宽度 = 屏幕宽度 × 0.8 窗口高度 = 屏幕高度 × 0.7
如果屏幕是 1920×1080,那么:
窗口宽度 ≈ 1536 窗口高度 ≈ 756
在实际易语言程序中,可以先获取屏幕尺寸,再将计算结果应用到窗口的宽度和高度属性。
需要注意的是,不建议简单地让窗口始终等于整个屏幕尺寸。普通桌面程序通常还需要考虑任务栏、窗口边框以及用户已有的窗口布局。
六、根据分辨率实现界面自适应
固定坐标是很多传统桌面程序容易出现的问题。
例如开发者按照 1920×1080 屏幕设计界面,将按钮固定放置在:
X = 1600 Y = 900
当程序运行到 1366×768 的电脑上时,该按钮就可能出现位置偏移甚至无法正常显示的问题。
因此,可以利用屏幕尺寸进行比例计算。
例如设计基准分辨率为:
设计宽度 = 1920 设计高度 = 1080
当前屏幕为:
当前宽度 = 1366 当前高度 = 768
可以计算横向缩放比例:
横向比例 = 当前宽度 ÷ 1920
纵向比例:
纵向比例 = 当前高度 ÷ 1080
然后根据比例重新计算控件的位置和尺寸。
这种方式比单纯判断“是不是 1920×1080”更加灵活。
七、读取屏幕分辨率时需要注意 DPI 缩放
Windows 10、Windows 11 等系统普遍支持显示缩放,例如:
100% 125% 150% 175%
很多开发者第一次测试屏幕尺寸时,会发现 API 返回的数据与系统设置界面中的实际显示效果存在差异。
原因之一就是 DPI 缩放。
例如显示器物理分辨率为:
3840 × 2160
系统设置为 150% 缩放时,普通应用看到的逻辑尺寸可能与实际物理像素存在区别。
因此,在开发需要精确定位窗口或鼠标坐标的软件时,不能只考虑分辨率,还需要考虑 DPI 感知能力。
如果程序涉及:
-
屏幕截图
-
鼠标坐标定位
-
自动化操作
-
窗口像素级定位
-
高清屏适配
-
界面缩放
就应该进一步研究 Windows DPI Awareness 机制。
八、多显示器环境不能只读取一个分辨率
GetSystemMetrics 获取的是系统主屏幕相关尺寸。对于只有一个显示器的电脑,这通常已经足够。
但是现在很多用户会同时使用:
笔记本屏幕 + 外接显示器
或者:
双显示器
甚至:
三显示器
这时候就不能简单地认为整个桌面只有一个 1920×1080 的区域。
多显示器环境下,每台显示器都可能拥有不同的:
-
分辨率
-
DPI
-
缩放比例
-
坐标位置
-
横竖屏方向
例如:
显示器1:1920 × 1080 显示器2:2560 × 1440
如果程序需要知道每个显示器的具体尺寸,就应该进一步使用 Windows 的多显示器 API,例如枚举显示器设备并获取对应的显示区域。
九、区分屏幕分辨率与工作区域
开发桌面程序时,还有一个经常被忽略的概念:工作区域。
屏幕分辨率表示整个显示区域,例如:
1920 × 1080
但用户桌面通常还存在任务栏。任务栏占用的区域不会用于普通窗口的最大化工作区域。
因此:
屏幕尺寸 ≠ 可用工作区域
如果程序的目标是自动设置窗口,使其完整显示在桌面可用区域内,那么使用工作区域相关 API 通常比单纯获取屏幕分辨率更合适。
Windows 提供了对应的系统指标,例如:
SM_CXFULLSCREEN SM_CYFULLSCREEN
不过在复杂桌面环境中,更推荐根据具体显示器的工作区域进行判断。
十、常见错误及排查方法
1. API 声明错误
如果调用 GetSystemMetrics 时程序提示 DLL 命令相关错误,需要检查:
user32.dll
是否填写正确,同时确认 API 函数名称和参数类型是否正确。
2. 宽度和高度写反
常见错误是将:
SM_CXSCREEN SM_CYSCREEN
混淆。
其中:
CX = 水平方向宽度 CY = 垂直方向高度
所以应该是:
GetSystemMetrics (0) → 宽度 GetSystemMetrics (1) → 高度
3. 把分辨率当成工作区域
如果程序需要将窗口放到桌面可用区域,应考虑任务栏等因素,而不能简单使用屏幕分辨率作为窗口最大尺寸。
4. 忽略 DPI 缩放
在普通工具中问题可能不明显,但涉及鼠标坐标、截图和自动化操作时,DPI 不一致很容易造成坐标偏移。
5. 忽略多显示器
只调用一次 GetSystemMetrics 并不能满足多显示器程序的全部需求。需要精确控制某一块显示器时,应采用显示器枚举方案。
十一、如何选择合适的实现方式
如果只是制作普通易语言桌面程序,可以按照实际需求选择:
| 使用场景 | 推荐方案 |
|---|---|
| 获取主屏幕宽高 | 易语言系统功能 |
| 简单获取 Windows 屏幕尺寸 | GetSystemMetrics |
| 设置窗口初始大小 | 屏幕尺寸 + 比例计算 |
| 获取桌面可用区域 | 工作区域相关 API |
| 多显示器处理 | 显示器枚举 API |
| 高清屏适配 | 分辨率 + DPI 综合处理 |
| 自动化坐标操作 | 分辨率 + DPI + 显示器信息 |
| 屏幕截图程序 | 显示器信息 + DPI 综合处理 |
对于学习易语言的初学者而言,可以先掌握 GetSystemMetrics 的使用方式,再逐步了解 Windows 显示器和 DPI 相关 API。
十二、总结
易语言读取屏幕分辨率并不复杂,最基础的实现就是获得屏幕宽度和高度。对于 Windows 桌面程序,可以通过 GetSystemMetrics 分别获取 SM_CXSCREEN 和 SM_CYSCREEN,从而得到主屏幕的水平和垂直尺寸。
简单程序可以直接使用:
宽度 = GetSystemMetrics (0) 高度 = GetSystemMetrics (1)
如果程序进一步涉及窗口自适应、高清屏、多显示器、屏幕截图或者自动化操作,则不能只关注分辨率本身,还需要综合考虑工作区域、DPI 缩放以及不同显示器之间的尺寸差异。
掌握这些基础知识后,易语言屏幕分辨率读取就不仅仅是获取两个数字,而可以进一步应用到窗口布局、界面自适应和桌面工具开发等实际场景中。