Программирование на Delphi - обмен опытом / Видеоадаптер и монитор

© Зайцев Олег 1998-2004
Лучшая портативная техника. Плееры Камеры Телефоны Компьютеры
Покупателям, пришедшим на www.porta.ru по этой ссылке - дополнительная скидка 1%
Железо | Система | WEB | Компоненты | Графика | Ссылки | Мультимедиа | Сети | Прочее | Реестр | Литература

Статистика

Видеоадаптер и монитор

Рекомендую:
Главная страница \ Железо \ Видеоадаптер и монитор

  • Видеоадаптер и монитор

    Видеоадаптер и монитор

    Включение/выключение монитора программным способом. * * Задать вопрос Наверх
    Управление питание возможно только для мониторов, поддерживающих режим "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.
    
    Видеорежим характеризуется слудующими парметрами:

    Реакция на смену настроек экрана * * Задать вопрос Наверх
    При смене настроек экрана система рассылает окнам сообщение 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