多显示器利用EnumDisplayMonitors、EnumDisplaySettings函数获取主屏幕、扩展屏幕的分辨率、刷新率等信息

breezee 2023-8-7 738

之前在群里看到群友问:如何获取当前显示器的刷新率?

我记得aardio中有关于获取硬件信息的范例,研究了一下,发现主要是利用了EnumDisplayMonitors、EnumDisplayDevices、EnumDisplaySettings等几个关键函数。

于是整理了一下,写了如下aardio代码:

import console;
import sys.monitor;
 
var count = 0;
for( hMonitor,monitorInfo in sys.monitor.eachInfo() ){ //枚举显示器
	if(monitorInfo){		
		var idx = -1/*_ENUM_CURRENT_SETTINGS*/; //检索显示设备的当前设置
		var devMode = sys.monitor.DEVMODE_DISPLAY_DEVICE();
		var flags = 0x2/*_EDS_RAWMODE*/;
		::User32.EnumDisplaySettingsExW(monitorInfo.deviceName, idx, devMode, flags);
		
		count++;
		console.log("【第 " + count + " 台显示器】");
		console.log("名    称 ", monitorInfo.deviceName);
		console.log("主显示器", (monitorInfo.flags == 1) ? "是" : "否");
		console.log("分 辨 率", devMode.pelsWidth + " x " + devMode.pelsHeight);
		console.log("刷 新 率", devMode.displayFrequency);
		console.log("位 深 度", devMode.bitsPerPel);
		console.log("屏幕方向", (devMode.pelsWidth > devMode.pelsHeight) ? "横向" : "纵向");
		console.log("显示方向", devMode.displayOrientation*90 + " 度");
		console.log(string.format('屏幕坐标\t(%d,%d)-(%d,%d)', monitorInfo.rcMonitor.left, monitorInfo.rcMonitor.top, monitorInfo.rcMonitor.right, monitorInfo.rcMonitor.bottom));
		console.log(string.format('工 作 区\t(%d,%d)-(%d,%d)', monitorInfo.rcWork.left, monitorInfo.rcWork.top, monitorInfo.rcWork.right, monitorInfo.rcWork.bottom));
 
		import gdi;
		console.log(" DPI缩放", (gdi.getDpiScale()));
		console.log();
	}
}
 
console.pause(true);

获取结果如下:

美中不足的是,实际的显示器品牌和名称不能获取到,网上查了资料得靠解析注册表中的EDID(Extend Display Identification Data扩展显示器识别数据),有空再去深入研究一下。

PS: MSDN关于devMode的详细资料


最新回复 (2)
  • 光庆 2023-8-8
    0 2

     黑科技,涨姿势,必须要顶!

  • lerh 2023-8-9
    0 3
    顶顶顶
返回