Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Смена разрешения на 2 и более мониторах


Автор: Ashkana 11.11.2010, 13:44
О смене разрешения написано много, однако везде разрешение меняется на единственном мониторе.
Возникла задача менять разрешение на 2 и более мониторах.

Код

Var
SDF: String;
dm : TDEVMODE;
ret: integer;

      begin
      SDF:=Edit1.Text; \\ Edit1.Text - \\.\DISPLAY1 или \\.\DISPLAY2 или \\.\DISPLAY3
      ZeroMemory(@dm, sizeof(DEVMODE));
      dm.dmSize := sizeof(DEVMODE);
      dm.dmBitsPerPel := 16;
      dm.dmPelsWidth := 800; 
      dm.dmPelsHeight := 600;         
      dm.dmDisplayFrequency := 60;
      dm.dmFields :=DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT or DM_DISPLAYFREQUENCY or DM_DISPLAYFLAGS or DM_POSITION;    

      ret:=ChangeDisplaySettingsEx(Pchar(SDF), dm, 0,  CDS_UPDATEREGISTRY or CDS_NORESET , 0); 
      // ret возвращает 0     
      ChangeDisplaySettingsEx('', PDeviceMode(nil)^, 0, StrToInt('0x40'), nil); 
     end;



Код должен работать и не работает. Разрешение не меняется.
Почему ?
Спасибо.

Автор: ama_kid 11.11.2010, 16:21
Взял исходник http://www.delphimaster.ru/articles/display/index.html, доработал напильником для своей двухмониторной системы (особо не вникал в суть, правда), проверил - вроде работает - на обоих монитора независимо выставляет разрешения. Забирай в аттаче и сравнивай что не так с твоим вариантом.

Автор: Ashkana 13.11.2010, 17:27
Цитата(ama_kid @ 11.11.2010,  16:21)
Взял исходник http://www.delphimaster.ru/articles/display/index.html, доработал напильником для своей двухмониторной системы (особо не вникал в суть, правда), проверил - вроде работает - на обоих монитора независимо выставляет разрешения. Забирай в аттаче и сравнивай что не так с твоим вариантом.

Спасибо БОЛЬШОЕ. Работает.
Отличие от того примера который был в том , что указывается номер режима ,  не  а  разрешение.
Было:
Код


      dm.dmBitsPerPel := 16;
      dm.dmPelsWidth := 1024;  
      dm.dmPelsHeight := 768;


Есть только один вопрос - если 2 дисплей не активен - не стоит галка в свойствах экрана "Расширить рабочий стол на этот монитор",
то разрешение меняется - ChangeDisplaySettingsEx возвращает DISP_CHANGE_SUCCESSFUL, но экран не загорается.
Для того чтобы он стал активен необходимо изменить флаг DISPLAY_DEVICE_ATTACHED_TO_DESKTOP .
Как изменить не могу понять ?

Спасибо.

Автор: Ashkana 13.11.2010, 17:42
Вопрос не праздный.
Есть такая ситуация многократно описанная пользователями и не имеющая решения на сегодняшний день.
Существуют видеокарты ATI 5700 и 5800 серии позволяющие подключить три (!) монитора к одной видеокарте , два по DVI и еще один по DisplayPort .
При использовании существует одна особенность - после полного выключения питания ( перезагрузка не влияет ) при включении система отключает первые 2 монитора подключенные по DVI и выставляет на 3 мониторе не первичное разрешение. Т.е. при каждом включении питания ОС видит монитор подключенный по DisplayPort как "в первый раз". Приходится активизировать в свойствах экрана первые два монитора, выставлять первичное разрешение на мониторе подключенном по DisplayPort  и заново расставлять значки на трех мониторах. Компьютер используется художником, поэтому 3 монитора не роскошь в данном случае. 

Спасибо.

Автор: ama_kid 13.11.2010, 18:18
Ashkana, к сожалению, я буду на работе, где у меня двухмониторная система, только в понедельник. Пока на вскидку нагуглил только http://www.autohotkey.com/forum/topic21800.html с активным обсуждением. Там пробуют разные варианты с переменным успехом. Попробуй пройти по их стопам, если не поможет - на следующей неделе попробуем что-нибудь еще.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)