显卡有双头,可以在第二个头显示屏幕2的内容。程序里面需要控制屏幕2的分辨率,从桌面-属性-设置-屏幕分辨率里可以手工设置。我的代码:
function ChgDisplaySetting():Boolean;
var
  DevMode:TDeviceMode;
  dd:TDisplayDevice;
  ScreenNo:Integer;
  ret:Boolean;
begin
//  ScreenNo:=0;
//  repeat
//    ZeroMemory(@dd,SizeOf(TDisplayDevice));
//    dd.cb :=  SizeOf(TDisplayDevice);
//    ret := EnumDisplayDevices(nil,ScreenNo,dd,0);
//    Form1.Memo1.Lines.Add(dd.DeviceName);
//    Form1.Memo1.Lines.Add(dd.DeviceString);
//    Form1.Memo1.Lines.Add('--------------------');
//    Inc(ScreenNo);
//  until not ret;    ScreenNo:=1;
    ZeroMemory(@dd,SizeOf(TDisplayDevice));
    dd.cb :=  SizeOf(TDisplayDevice);
    ret := EnumDisplayDevices(nil,ScreenNo,dd,0);  ZeroMemory(@DevMode,Sizeof(TDeviceMode));
  DevMode.dmSize := Sizeof(TDeviceMode);
  Result := EnumDisplaySettings(dd.DeviceName,4294967295-1,DevMode);
  if Result then
  begin             
    DevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_DISPLAYFLAGS;
    DevMode.dmPelsWidth := 800;
    DevMode.dmPelsHeight := 600;
    StrPCopy(DevMode.dmDeviceName,dd.DeviceName);
    Result := ChangeDisplaySettingsEx(dd.DeviceName,DevMode,0,CDS_NORESET or CDS_UPDATEREGISTRY,0)=DISP_CHANGE_SUCCESSFUL;
    //ChangeDisplaySettings(DevMode,0);
  end;
end;代码不管怎么改,修改的总是第一块屏幕的分辨率,不知道哪个地方没写对。希望大家指点一下。

解决方案 »

  1.   

    dd.DeviceName这个参数的值可能有问题
      

  2.   

    Windows SDK里没找到EnumDisplayDevices这个函数的介绍
      

  3.   

            ScreenNo:=1; 
      

  4.   

    这句
    Result   :=   ChangeDisplaySettingsEx(dd.DeviceName,DevMode,0,CDS_NORESET   or   CDS_UPDATEREGISTRY,0)=DISP_CHANGE_SUCCESSFUL;改为:
    Result   :=   ChangeDisplaySettingsEx(dd.DeviceName,DevMode,0,0,nil)=DISP_CHANGE_SUCCESSFUL;我一直这样用的,没明白后面的参数
      

  5.   

    firstly you need to check if display is attached to desktop .
    secondly 
    DevMode.dmFields   :=   DM_PELSWIDTH   or   DM_PELSHEIGHT   or   DM_POSITION or DM_DISPLAYFLAGS
      

  6.   

    这个是我写的改分辨率、刷新率的方法,可以改屏幕1或屏幕2,下面是改屏幕2分辨率及刷新率的调用。configmonitor('\\.\Display2',1024,768,85);procedure Tfmcontrol.configmonitor(smonitor: pchar; monitor_x,monitor_y,frequency: integer);
    var
      DevMode:TDeviceMode;
    begin
      EnumDisplaySettings(smonitor,Cardinal(-1),DevMode);
      DevMode.dmFields:=DM_PELSWIDTH Or DM_PELSHEIGHT OR DM_DISPLAYFREQUENCY;
      DevMode.dmPelsWidth:=monitor_x;
      DevMode.dmPelsHeight:=monitor_y;
      DevMode.dmDisplayFrequency:= Cardinal(frequency);
      ChangeDisplaySettingsex(smonitor,DevMode,0,CDS_FULLSCREEN,0)
    end;
      

  7.   

    好久没有上来了,差点忘了这个帖子了。给回帖的朋友说声对不起。其实ewin1018回答的就是正确的。具体的原因可以参考msdn,我这个机器没有装,就不贴出来了。