Для начала узнаем, с какой видеокартой мы работаем:
procedure TForm1.Button1Click(Sender: TObject);
var
lpDisplayDevice: TDisplayDevice;
dwFlags: DWORD;
cc:
DWORD;
begin
Memo1.Clear;
lpDisplayDevice.cb :=
sizeof(lpDisplayDevice);
dwFlags := 0;
cc := 0;
while EnumDisplayDevices(nil, cc, lpDisplayDevice, dwFlags)
do
begin
Inc(cc);
Memo1.lines.add(lpDisplayDevice.DeviceString);
end;
end;
Теперь разместим на форме ListBox и Button. В обработчике создания формы
пишем:
procedure TForm1.FormCreate(Sender: TObject);
var
i:
Integer;
DevMode: TDevMode;
begin
i:=0;
while
EnumDisplaySettings(nil,i,DevMode) do
begin
with
Devmode do
ListBox1.Items.Add(Format('%dx%d %d
Colors',
[dmPelsWidth,dmPelsHeight,1 shl
dmBitsperPel]));
Inc(i);
end;
end;
Вы увидите все возможные комбинации разрешений и цветов, которые поддерживает
дисплей. Теперь пишем в нажатии на кнопку:
procedure TForm1.Button1Click(Sender: TObject);
var
DevMode:
TDeviceMode;
liRetValue: Longint;
begin
if
EnumDisplaySettings(nil,Listbox1.ItemIndex,Devmode) then
liRetValue :=
ChangeDisplaySettings(DevMode, CDS_UPDATEREGISTRY);
SendMessage(HWND_BROADCAST, WM_DISPLAYCHANGE, SPI_SETNONCLIENTMETRICS,
0);
end;
function ChangeDisplaySettings(var lpDevMode: TDeviceMode; dwFlags: DWORD):
Longint; stdcall;
Параметры:
-
lpDevMode Структура с описанием видеорежима, на который мы хотим
переключиться.
-
dwFlags Определяет как будет изменен видеорежим.
-
0 - Немедленное изменение видеорежима. Установка данного флага
возвращает в видеорежим по умолчанию, установленному в реестре, если он был
изменен с применением флага CDS_FULLSCREEN, при этом первый параметр функции
должен быть nil и флаги равны 0.
-
CDS_UPDATEREGISTRY - Видеорежим будет изменен немедленно и информация
записана в реестр в пользовательский профиль.
-
CDS_TEST - Запрос теста видеорежима средствами Windows
-
CDS_FULLSCREEN - Установка видеорежима временна.
-
CDS_GLOBAL - Видеорежим будет изменен для всех пользователей данной
машины. Иначе видеорежим меняется только для текущего пользователя.
Используется вместе с флагом CDS_UPDATEREGISTRY.
-
CDS_SET_PRIMARY - Видеорежим становится первичным.
-
CDS_RESET - Параметры видеорежима будут изменены, даже если совпадают с
текущими.
-
CDS_NORESET - Изменения будут записаны в реестр, но не вступят в силу.
Используется с флагом CDS_UPDATEREGISTRY
-
Возвращаемое значение:
-
DISP_CHANGE_SUCCESSFUL Изменения прошли успешно.
-
DISP_CHANGE_RESTART Необходима перезагрузка для вступления изменений в
силу
-
DISP_CHANGE_BADFLAGS Передан неверный набор флагов
-
DISP_CHANGE_BADPARAM Неверные параметры.
-
DISP_CHANGE_FAILED Драйвер видеоустройства не смог установить режим
-
DISP_CHANGE_BADMODE Видеорежим не поддерживается
-
DISP_CHANGE_NOTUPDATED Windows NT/2000: Ошибка записи в реестр
После этого Вам достаточно выбрать в ListBox нужную комбинацию и изменить
разрешение нажатием на Button.
Внимание:
-
Не рекомендуется устанавливать значение видео-режима, который не
присутствует в списке доступных. Это может привести к мерцанию экрана либо
вообще к исчезновению изображения.
-
Многие адаптеры требуют перезагрузку компьютера при смене разрешения.
-
SendMessage используется для оповещения всех окна о смене видеорежима.
При изменениях видеорежима генерируется сообщение WM_DISPLAYCHANGE.
Необходимо создать обработчик данного сообщения в вашем приложении.
private
procedure WMDisplayChange(var message:TMessage); message
WM_DISPLAYCHANGE;
//...
procedure TForm1.WMDisplayChange(var message: TMessage);
begin
ShowMessage('Какие-то параметры дисплея изменили!');
inherited;
end;