如何通过控制台程序修改显示分辨率

在某些特定的应用场景,比如游戏,可能需要通过控制台程序来修改显示分辨率。本文将介绍一个简单的方法,通过一个批处理文件(.bat文件)来实现这一功能。

用户指南

这是一个控制台应用程序,它需要两个参数:期望的宽度和高度。程序不会做任何假设或设置默认值,只是简单地检查输入并进行转换为整数。

C:\>chscrres 1024 768 C:\>chscrres 1280 1024

开发者指南

程序首先枚举设备列表,使用一个名为DDList的结构来处理。这个结构由DDList_Build函数构建列表,DDList_Clean函数释放列表,DDList_Pop函数从列表中提取第一个项目。实现使用了简单的链表和EnumDisplayDevices API来检索显示设备,使用DISPLAY_DEVICE_ATTACHED_TO_DESKTOP掩码。根据需要,也可以使用其他掩码。

C++ struct DDList { DISPLAY_DEVICE Device; struct DDList *Next; };

构建列表后,如果列表中有设备,则从列表中提取第一个设备。根据设备数量和/或附加条件,可能需要重写DDList_Pop调用(或实现一个DDList_PopEx来传递附加数据),以获取DDList中的期望DISPLAY_DEVICE结构。

最后,为提取的设备更改分辨率。首先,使用EnumDisplaySettingsEx调用检索DEVMODE结构;现有的DEVMODE的dmPelsWidth/dmPelsHeight与命令行中传递的值进行比较,如果至少有一个不同,则使用新的宽度和高度更新DEVMODE结构,并调用ChangeDisplaySettingsEx来更新设备。

如果ChangeDisplaySettingsEx返回DISP_CHANGE_SUCCESSFUL,则使用以下代码通知系统显示已更改:

C++ // broadcast change to system SendMessage(HWND_BROADCAST, WM_DISPLAYCHANGE, (WPARAM)(deviceMode.dmBitsPerPel), MAKELPARAM(newWidth, newHeight));

(尽管在XP、2000和NT4上测试了这个程序,但不能保证它在其他系统上也能工作。不想因为显示器损坏而被起诉。请自行尝试并查看结果。)

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485