在某些特定的应用场景,比如游戏,可能需要通过控制台程序来修改显示分辨率。本文将介绍一个简单的方法,通过一个批处理文件(.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上测试了这个程序,但不能保证它在其他系统上也能工作。不想因为显示器损坏而被起诉。请自行尝试并查看结果。)