Видеоадаптер и монитор Видеоадаптер и монитор
Включение/выключение монитора программным способом. |
*
| *
|
| |
Управление питание возможно только для мониторов, поддерживающих режим "Stand by"
Предупреждаю сразу! После того, как вы отключите монитор, просто так вы его уже
не включите (хотя это может быть зависит от монитора, Samsung SM3Ne, например,
включается). Только после перезагрузки компьютера.
// Отключить :
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 0);
// Задержка ...
Sleep(5000);
// Включить
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
Как изменить размер рабочей области экрана |
*
| *
|
| |
При необходимости это можно сделать при помощи вызова SystemParametersInfo
с параметром SPI_SETWORKAREA
var
r:trect;
begin
r := Rect(1,1,100,100); // Определяет размеры новой рабочей области
SystemParametersInfo(SPI_SETWORKAREA,0,@R,0);
end;
Если вместо @R передать NULL (0), то восстанавливается нормальная рабочая
область. При вызовах этой функции следует осторожность, иначе придется
перезагружать компьютер. В частности, можно задать рабочую область с размерами,
превышающими размер экрана и утащить туда окно.
Рабочая зона автоматически
устанавливается при перетаскивании панели Windows
Определение размера экрана и рабочего стола |
*
| *
|
| |
Размеры экрана проще всего определить при помощи чтения значения свойств
Screen.Width и Screen.Height
Определение размера рабочего стола производится при помощи функции
SystemParametersInfo:
var
AreaRect : TRect;
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @AreaRect, 0);
Edit1.Text := IntToStr(AreaRect.Left)+','+
IntToStr(AreaRect.Top)+','+
IntToStr(AreaRect.Right)+','+
IntToStr(AreaRect.Bottom);
end;
В моем случае возвращалось значение "0,0,1024,738"
(панель инструментов расположена внизу)
Получение списка видеоадаптеров и поддерживаемых видеорежимов |
*
| *
|
| |
Через API можно получить список видеоадаптеров при помощи функции
EnumDisplayDevices. При помощи этой же функции можно получить список
мониторов для каждого видеоадаптера. Кроме того, в API существует
функция EnumDisplaySettings, позволяющая получить список поддерживаемых
устройством видеорежимов.
Пример получения списка видеоадаптеров (для каждого видеоадаптера
выводится список мониторов и поддерживаемых видеорежимов).
var
lpDisplayDevice: TDisplayDevice;
DevMode : TDevMode;
S : String;
i, j, k : integer;
begin
// Подготовка структуры lpDisplayDevice
lpDisplayDevice.cb := sizeof(lpDisplayDevice);
// Получение списка видеоадаптеров
i := 0;
while EnumDisplayDevices(nil, i, lpDisplayDevice, 0) do begin
Inc(i);
Memo1.Lines.Add('***** '+lpDisplayDevice.DeviceString + ' *****');
Memo1.Lines.Add(' DeviceName = ' +lpDisplayDevice.DeviceName + ' - ' + lpDisplayDevice.DeviceString);
S := lpDisplayDevice.DeviceName;
j := 0;
Memo1.Lines.Add(' Мониторы ' );
// Получение списка мониторов
while EnumDisplayDevices(@S[1], j, lpDisplayDevice, 0) do begin
inc(j);
memo1.lines.add(' DeviceMonitor = ' +lpDisplayDevice.DeviceName + ' - ' + lpDisplayDevice.DeviceString);
end;
k := 0;
Memo1.Lines.Add(' Видеорежимы ' );
// Получение списка поддерживаемых видеорежимов
while EnumDisplaySettings(Pchar(S), k, DevMode) do begin
Memo1.Lines.Add(' --- режим № '+IntToStr(k)+' ---');
inc(k);
Memo1.Lines.Add('DevMode.dmDeviceName = ' + DevMode.dmDeviceName);
Memo1.Lines.Add('DevMode.dmBitsPerPel = ' + IntToStr(DevMode.dmBitsPerPel));
Memo1.Lines.Add('DevMode.dmPelsWidth = ' + IntToStr(DevMode.dmPelsWidth));
Memo1.Lines.Add('DevMode.dmPelsHeight = ' + IntToStr(DevMode.dmPelsHeight));
Memo1.Lines.Add('DevMode.dmDisplayFrequency = ' + IntToStr(DevMode.dmDisplayFrequency) + ' Гц');
end;
end;
end;
end.
Видеорежим характеризуется слудующими парметрами:
- DevMode.dmBitsPerPel - количество бит, применяемых при кодировании цвета пиксела
- DevMode.dmPelsWidth - количество пикселов по горизонтали
- DevMode.dmPelsHeight - количество пикселов по вертикали
- DevMode.dmDisplayFrequency - частота развертки в Гц
Реакция на смену настроек экрана |
*
| *
|
| |
При смене настроек экрана система рассылает окнам сообщение
WM_DISPLAYCHANGE, остается только создать обработчик для его
перехвата:
procedure WMDisplayChange(var msg: TMessage); message WM_DISPLAYCHANGE;
... ... ...
procedure TForm1.WMDisplayChange(var msg: TMessage);
begin
Memo1.Lines.Add(DateTimeToStr(Now) + ' - изменены настройки экрана');
inherited;
end;
© Зайцев Олег, "Программирование на Delphi - обмен опытом" 1999-2004. При использовании любых материалов данного сайта
необходимо указывать источник информации. Дата обновления: 22.11.2004. Сайт размещен на хостинге AGAVA - Хостинг от AGAVA.ru