之前在群里看到群友问:如何获取当前显示器的刷新率?
我记得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的详细资料