Delphi 如何以编程方式更改特定监视器的分辨率?
如何以编程方式更改特定监视器的分辨率?例如,可以通过编程方式更改辅助监视器分辨率吗?以下函数可能是您的起点。它试图将索引由Delphi 如何以编程方式更改特定监视器的分辨率?,delphi,Delphi,如何以编程方式更改特定监视器的分辨率?例如,可以通过编程方式更改辅助监视器分辨率吗?以下函数可能是您的起点。它试图将索引由索引参数(如果存在)指定的显示设备的分辨率更改为宽度,高度参数给定的宽度和高度(以像素为单位)。如果找到具有给定索引的显示设备且其分辨率已成功更改,则函数返回True,否则返回False 您尚未指定是要永久更改分辨率(如果要存储设置更改),还是仅临时更改分辨率。以下示例暂时执行此操作,但如果在第二个函数中使用dwflags参数的CDS\u UPDATEREGISTRY值,则可
索引
参数(如果存在)指定的显示设备的分辨率更改为宽度
,高度
参数给定的宽度和高度(以像素为单位)。如果找到具有给定索引的显示设备且其分辨率已成功更改,则函数返回True,否则返回False
您尚未指定是要永久更改分辨率(如果要存储设置更改),还是仅临时更改分辨率。以下示例暂时执行此操作,但如果在第二个函数中使用dwflags
参数的CDS\u UPDATEREGISTRY
值,则可以非常简单地更改此行为:
function ChangeMonitorResolution(Index, Width, Height: DWORD): Boolean;
var
DeviceMode: TDeviceMode;
DisplayDevice: TDisplayDevice;
begin
Result := False;
ZeroMemory(@DisplayDevice, SizeOf(DisplayDevice));
DisplayDevice.cb := SizeOf(TDisplayDevice);
// get the name of a device by the given index
if EnumDisplayDevices(nil, Index, DisplayDevice, 0) then
begin
ZeroMemory(@DeviceMode, SizeOf(DeviceMode));
DeviceMode.dmSize := SizeOf(TDeviceMode);
DeviceMode.dmPelsWidth := Width;
DeviceMode.dmPelsHeight := Height;
DeviceMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
// check if it's possible to set a given resolution; if so, then...
if (ChangeDisplaySettingsEx(PChar(@DisplayDevice.DeviceName[0]),
DeviceMode, 0, CDS_TEST, nil) = DISP_CHANGE_SUCCESSFUL)
then
// change the resolution temporarily (if you use CDS_UPDATEREGISTRY
// value for the penultimate parameter, the graphics mode will also
// be saved to the registry under the user's profile; for more info
// see the ChangeDisplaySettingsEx reference, dwflags parameter)
Result := ChangeDisplaySettingsEx(PChar(@DisplayDevice.DeviceName[0]),
DeviceMode, 0, 0, nil) = DISP_CHANGE_SUCCESSFUL;
end;
end;
如何将辅助显示设备(索引为1的设备)的分辨率更改为800x600的示例:
procedure TForm1.Button1Click(Sender: TObject);
begin
if ChangeMonitorResolution(1, 800, 600) then
ShowMessage('Resolution of display device with index 1 has been changed!')
else
ShowMessage('Display device with index 1 doesn''t exist, doesn''t support ' +
'resolution 800x600 or changing failed due to a reason, which you might ' +
'know if the author of this function wouldn''t be so lazy!');
end;
如果我正确理解了您的问题-我希望您至少考虑询问用户。。。没有德尔菲法。最后,您可能会使用
ChangeDisplaySettingsEx
,但必须先验证是否有第二个监视器(您可以使用TScreen
)以及它是否支持您的分辨率(EnumDisplaySettings
)。在我看来,这个问题并没有解决。很不清楚你想要什么。你是在问如何通过编程更改特定显示器的显示分辨率吗?是的,就这么简单。以编程方式。这个开发者论坛,是吗?我们能要求停止编程吗?@TLama-RE-edit:这里似乎有些混乱,显示设备不是主要的,次要的。监视器是。这不是吹毛求疵,f.i.我的辅助监视器在\\.\DISPLAY7(第六显示设备)上。海报似乎要求更改其作品中第二台显示器的分辨率。@gogglepink问题现已解决。但不是你。我不明白你为什么不编辑它。我的假设是,也许你没有意识到你可以。堆栈溢出是一个wiki。文章可以编辑、更新和改进。你的需要。特拉玛和罗布·门辛完成了这项工作。但下一次您应该这样做。我得到了错误:“在模块‘GDI32.dll’的地址xxxxxx处存在访问冲突。”。读取地址yyyyyyyy'I一直缺少dmFields
标志(在编写答案时丢失),但我认为,即使是这样,也不是导致严重失败的原因。您使用的是哪个版本的Delphi/Windows?我使用的是Delphi 7和我的操作系统WinXP Professional version 2002 Service Pack2@TLama-我花时间在XP上测试了这个。操作系统不喜欢结构中的垃圾。@TLama-实际上,它可能只是DevMode中的“dmDriverExtra”造成了麻烦,但我认为最好是出于安全考虑。但是我看不出有任何理由将TDisplay设备归零,然而,没有它,我的测试就不能正常进行。