ChangeDisplaySettingsExW 函数 (winuser.h)
ChangeDisplaySettingsEx 函数将指定显示设备的设置更改为指定的图形模式。
语法
LONG ChangeDisplaySettingsExW(
[in] LPCWSTR lpszDeviceName,
[in] DEVMODEW *lpDevMode,
HWND hwnd,
[in] DWORD dwflags,
[in] LPVOID lParam
);
参数
[in] lpszDeviceName
指向以 null 结尾的字符串的指针,该字符串指定其图形模式将更改的显示设备。 仅显示由 EnumDisplayDevices 返回的设备名称有效。 有关与这些显示设备关联的名称的详细信息,请参阅 EnumDisplayDevices。
lpszDeviceName 参数可以 NULL。 NULL 值指定默认显示设备。 可以通过调用 EnumDisplayDevices 并检查DISPLAY_DEVICE_PRIMARY_DEVICE标志来确定默认设备。
[in] lpDevMode
指向描述新图形模式的 DEVMODE 结构的指针。 如果 lpDevModeNULL,则注册表中当前的所有值都将用于显示设置。 为 lpDevMode 参数传递 NULL,对于 dwFlags 参数,传递 0 是动态模式更改后返回默认模式的最简单方法。
必须将 dmSize 成员初始化为 DEVMODE 结构的大小(以字节为单位)。 必须初始化 dmDriverExtra 成员,以指示 DEVMODE 结构后专用驱动程序数据的字节数。 此外,可以使用以下 DEVMODE 结构的任何成员。
成员 | 意义 |
---|---|
dmBitsPerPel | 每个像素的位数 |
dmPelsWidth | 像素宽度 |
dmPelsHeight | 像素高度 |
dmDisplayFlags | 模式标志 |
dmDisplayFrequency | 模式频率 |
dmPosition | 设备在多监视器配置中的位置。 |
除了使用上述一个或多个 DEVMODE 成员之外,还必须在 dmFields 成员中设置以下一个或多个值来更改显示设置。
价值 | 意义 |
---|---|
DM_BITSPERPEL | 使用 dmBitsPerPel 值。 |
DM_PELSWIDTH | 使用 dmPelsWidth 值。 |
DM_PELSHEIGHT | 使用 dmPelsHeight 值。 |
DM_DISPLAYFLAGS | 使用 dmDisplayFlags 值。 |
DM_DISPLAYFREQUENCY | 使用 dmDisplayFrequency 值。 |
DM_POSITION | 使用 dmPosition 值。 |
hwnd
保留;必须为 NULL
[in] dwflags
指示应如何更改图形模式。 此参数可以是下列值之一。
价值 | 意义 |
---|---|
|
当前屏幕的图形模式将动态更改。 |
|
模式本质上是暂时的。
如果切换到另一个桌面和从另一个桌面更改,则不会重置此模式。 |
|
这些设置将保存在全局设置区域中,以便它们会影响计算机上的所有用户。 否则,仅修改用户的设置。 仅当使用 CDS_UPDATEREGISTRY 标志指定时,此标志才有效。 |
|
设置将保存在注册表中,但不会生效。 仅当使用 CDS_UPDATEREGISTRY 标志指定时,此标志才有效。 |
|
应更改设置,即使请求的设置与当前设置相同。 |
|
此设备将成为主设备。 |
|
系统测试是否可以设置请求的图形模式。 |
|
当前屏幕的图形模式将动态更改,图形模式将在注册表中更新。 模式信息存储在用户配置文件中。 |
|
设置后,lParam 参数是指向 VIDEOPARAMETERS 结构的指针。 |
|
启用对不安全图形模式的设置更改。 |
|
禁用对不安全图形模式的设置更改。 |
指定CDS_TEST允许应用程序确定哪些图形模式实际上有效,而不会导致系统更改它们。
如果指定了CDS_UPDATEREGISTRY并且可以动态更改图形模式,则会将信息存储在注册表中,并返回DISP_CHANGE_SUCCESSFUL。 如果无法动态更改图形模式,信息将存储在注册表中,并返回DISP_CHANGE_RESTART。
如果指定了CDS_UPDATEREGISTRY,并且无法将信息存储在注册表中,则图形模式不会更改,并返回DISP_CHANGE_NOTUPDATED。
[in] lParam
如果 CDS_VIDEOPARAMETERSdwFlags,lParam 是指向 VIDEOPARAMETERS 结构的指针。 否则,lParam 必须 NULL。
返回值
ChangeDisplaySettingsEx 函数返回以下值之一。
返回代码 | 描述 |
---|---|
|
设置更改成功。 |
|
设置更改失败,因为系统支持 DualView。 |
|
传入了一组无效的标志。 |
|
不支持图形模式。 |
|
传入了无效参数。 这可以包括无效的标志或标志的组合。 |
|
显示驱动程序失败了指定的图形模式。 |
|
无法将设置写入注册表。 |
|
必须重启计算机才能使图形模式正常工作。 |
言论
为了确保传递给 ChangeDisplaySettingsEx 的 DEVMODE 结构有效,并且仅包含显示驱动程序支持的值,请使用由 EnumDisplaySettings 函数返回的 DEVMODE。
以编程方式将显示监视器添加到多监视器系统时,请将 DEVMODE.dmFields 设置为DM_POSITION,并为要添加的监视器指定位置(在 DEVMODE.dmPosition中),以添加该位置,该位置与现有监视器的显示区域至少一个像素相邻。 若要分离监视器,请将 DEVMODE.dmFields 设置为DM_POSITION,但 将 DEVMODE.dmPelsWidth 和 DEVMODE.dmPelsHeight 设置为零。 有关详细信息,请参阅 多个显示监视器。
当显示模式动态更改时,WM_DISPLAYCHANGE 消息将发送到具有以下消息参数的所有正在运行的应用程序。
参数 | 意义 |
---|---|
wParam | 每个像素的新位数 |
LOWORD(lParam) | 新的像素宽度 |
HIWORD(lParam) | 新像素高度 |
若要同时更改多个显示器的设置,请首先为每个设备调用 ChangeDisplaySettingsEx,以更新注册表而不应用更改。 然后使用 NULL 设备再次调用 ChangeDisplaySettingsEx 以应用更改。 例如,若要更改两个显示器的设置,请执行以下操作:
ChangeDisplaySettingsEx (lpszDeviceName1, lpDevMode1, NULL, (CDS_UPDATEREGISTRY | CDS_NORESET), NULL);
ChangeDisplaySettingsEx (lpszDeviceName2, lpDevMode2, NULL, (CDS_UPDATEREGISTRY | CDS_NORESET), NULL);
ChangeDisplaySettingsEx (NULL, NULL, NULL, 0, NULL);
DPI 虚拟化
此 API 不参与 DPI 虚拟化。 给定的输入始终以物理像素为单位,与调用上下文无关。注意
winuser.h 标头将 ChangeDisplaySettingsEx 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
支持的最低服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | 窗户 |
标头 | winuser.h (包括 Windows.h) |
库 | User32.lib |
DLL | User32.dll |
API 集 | ext-ms-win-ntuser-sysparams-ext-l1-1-1(在 Windows 10 版本 10.0.14393 中引入) |