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设备归零,然而,没有它,我的测试就不能正常进行。