Постановка задачи
Разработать программу, которая осуществляет настройку ОС Windows через реестр.
Поскольку ОС Windows не предоставляет возможность полной визуальной настройки, существует множество программ для "тонкой" настройки, этой операционной системы. Например, в Windows XP нельзя, просто "сбросив флажок", отключить автозагрузку с CD-ROM или заблокировать системный реестр. Все это можно сделать только через реестр, что не очень-то удобно. К тому же, запомнить все ключи реестра невозможно, а справочник не всегда оказывается под рукой.
В этой главе будет показано как написать программу для "тонкой" настройки ОС Windows. Мы не будем разрабатывать многофункциональное приложение, а создадим только шаблон, в который затем читатель сможет сам добавить необходимые ему пункты по настройке операционной системы.
⇘ Краткий справочник РїРѕ реестру Windows находится РІ приложении Р’.
Разработка формы
Создайте новый проект Delphi. Присвойте свойству Caption формы значение Настройка ОС Windows. Разместите на форме компонент GroupBox категории Standard и присвойте его свойству Caption значение Опции. На компоненте GroupBox разместите один над другим три компонента CheckBox категории Standard и присвойте их свойству Caption следующие значения: Отключить автозагрузку с CD-ROM, Отключить свойства экрана РЗаблокировать реестр. У нижнего края формы разместите кнопку (компонент Button категории Standard), присвоив ее свойству Caption значение Выполнить.
Полученная форма должна соответствовать рис. 12.1.
Рис. 12.1. Форма программы настройки Windows
Разработка программного кода
В программе потребуется обработать два события: создание формы и нажатие кнопки Выполнить. При создании формы мы должны считывать значения из реестра, и устанавливать соответствующие флажки. При нажатии кнопки Выполнить будут применяться выбранные пользователем настройки.
Для начала добавим в раздел uses ссылку на модуль Registry для работы с системным реестром. Также необходимо объявить глобальную переменную reg типа TRegistry, с помощью которой мы будем работать с реестром:
var
В Form1: TForm1;
В reg: TRegistry;
Обработчик события создания главной формы OnCreate:
procedure TForm1.FormCreate(Sender: TObject);
begin
 reg := TRegistry.Create; //открываем реестр
 //настройки для текущего пользователя
В reg.RootKey:= HKEY_CURRENT_USER;
 reg.OpenKey('SYSTEM\CurrentControlSet\Services\Cdrom' , False) ; //открываем раздел
 if reg.ValueExists('Autorun') then //если ключ существует
 if reg.readinteger('autorun') = 1 //и если он равен 1,
  then //то устанавливаем флажок первой опции
В В В CheckBox1.Checked:= True;
 reg.CloseKey; //закрываем реестр
 //Таким же образом проверяем остальные опции
 //Для опции "Отключить свойства экрана":
В reg := TRegistry.Create ;
В reg.RootKey:= HKEY_CURRENT_USER;
В reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\' +
В 'Policies\System', False);
В if reg.ValueExists('NoDispCPL') then
В if reg.ReadInteger('NoDispCPL') = 1 then CheckBox2.Checked:= True;
В reg.CloseKey;
 //для опции "Заблокировать реестр":
В reg:= TRegistry.Create;
В reg.RootKey:= HKEY_CURRENT_USER;
В reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\' +
В 'Policies\System', False);
В if reg.ValueExists('DisableRegistryTools') then
В if reg.ReadInteger('DisableRegistryTools') = 1 then CheckBox3.Checked:= True;
В reg.CloseKey;
end;
При создании формы мы проверяем, какие из опций уже установлены. Если опция уже установлена, то устанавливаем соответствующий флажок.
Обработчик события OnClick для кнопки Выполнить:
procedure TForm1.Button1Click(Sender: TObject);
begin
В if CheckBox1.Checked then
 begin //если установлен флажок напротив первой опции
 reg:= TRegistry.Create; //открываем реестр
 //открываем ветку реестра
В reg.RootKey:= HKEY_LOCAL_MACHINE;
 reg.OpenKey('SYSTEM\CurrentControlSet\Services\Cdrom', True); //открываем требуемый раздел в реестре
 //записываем соответствующий ключ
В reg.WriteInteger('Autorun', 1);
В reg.CloseKey;
 end else begin //иначе…
В reg:= TRegistry.Create;
В reg.RootKey:= HKEY_LOCAL_MACHINE;
В reg.OpenKey('SYSTEM\CurrentControlSet\Services\Cdrom', True);
 //…отключаем эту возможность
В reg.WriteInteger('Autorun', 0);
В reg.CloseKey;
В end;
 //Таким же образом обрабатываем остальные опции
 //Для опции "Отключить свойства экрана":
В if CheckBox2.Checked then begin
В reg:= TRegistry.Create;
В reg.RootKey:=HKEY_CURRENT_USER;
В reg.OpenKey('Software\microsoft\Windows\CurrentVersion\' +
В В 'Policies\System', True) ;
 //отключить свойства экрана
В reg.WriteInteger('NoDispCPL', 1);
В reg.CloseKey;
В end else begin
В reg:= TRegistry.Create;
В reg.RootKey:= HKEY_CURRENT_USER;
В reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\'+
В В 'Policies\System', True) ;
 //Восстановить свойства экрана
В reg.WriteInteger('NoDispCPL', 0);
В reg.CloseKey ;
В end;
 //Для опции "Заблокировать реестр":
В if CheckBox3.Checked then begin
В reg:= TRegistry.Create;
В reg.RootKey:= HKEY_CURRENT_USER;
В reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\' +
В В 'Policies\System', True) ;
 //Заблокировать реестр
В reg.WriteInteger('DisableRegistryTools', 1);
В reg.CloseKey;
В end else begin
В reg:= TRegistry.Create;
В reg.RootKey:= HKEY_CURRENT_USER;
В reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\' +
В В 'Policies\System', True);
 //открыть доступ к реестру
В reg.WriteInteger('DisableRegistryTools', 0);
В reg.CloseKey;
В end;
end;
По нажатию кнопки Выполнить мы проверяем состояние каждого флажка. Если флажок установлен, то мы записываем в реестр ключ, который включает выбранную опцию, в противном же случае — просто отключаем эту опцию.
Теперь можно откомпилировать Рё запустить программу РЅР° выполнение. Выберите, например, опцию Заблокировать реестр Рё нажмите РєРЅРѕРїРєСѓ Выполнить. Чтобы удостовериться РІ том, что реестр действительно заблокирован, выполните команду системного меню РџСѓСЃРє→Выполнить, РІ диалоговом РѕРєРЅРµ Запуск программы введите regedit Рё нажмите РєРЅРѕРїРєСѓ OK. Если вместо РѕРєРЅР° реестра РІС‹ увидите сообщение РѕР± ошибке "Редактирование реестра запрещено администратором системы" (СЂРёСЃ. 12.2), то это значит, что наша программа работает нормально.
Рис. 12.2. Программа заблокировала системный реестр Windows
После этого опять перейдите в программу Настройка ОС Windows, сбросьте флажок Заблокировать реестр и нажмите кнопку Выполнить. Попробуйте еще раз войти в реестр. Как видите, теперь никаких препятствий не возникает.
Полный исходный код модуля
Полный исходный код модуля программы настройки Windows представлен в листинге 12.1.
Листинг 12.1. Модуль программы настройки Windows
unit Unit1;
interface
uses
В Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Registry;
type TForm1 = class(TForm)
В Button1: TButton;
В GroupBox1: TGroupBox;
В CheckBox1: TCheckBox;
В CheckBox2: TCheckBox;
В CheckBox3: TCheckBox;
В procedure Button1Click(Sender: TObject);
В procedure FormCreate(Sender: TObject);
private
В { Private declarations }
public
В { Public declarations }
end;
var
В Form1: TForm1;
В reg: Tregistry;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
В if CheckBox1.Checked then
 begin //если установлен флажок напротив первой опции
 reg:= TRegistry.Create; //открываем реестр
 //открываем ветку реестра
В reg.RootKey:= HKEY_LOCAL_MACHINE;
 reg.OpenKey('SYSTEM\CurrentControlSet\Services\Cdrom', True); //открываем требуемый раздел в реестре
 //записываем соответствующий ключ
В reg.WriteInteger('Autorun', 1);
В reg.CloseKey;
 end else begin //иначе…
В reg:= TRegistry.Create;
В reg.RootKey:= HKEY_LOCAL_MACHINE;
В reg.OpenKey('SYSTEM\CurrentControlSet\Services\Cdrom', True);
 //…отключаем эту возможность
В reg.WriteInteger('Autorun', 0);
В reg.CloseKey;
В end;
 //Таким же образом обрабатываем остальные опции
 //Для опции "Отключить свойства экрана":
В if CheckBox2.Checked then begin
В reg:= TRegistry.Create;
В reg.RootKey:=HKEY_CURRENT_USER;
В reg.OpenKey('Software\microsoft\Windows\CurrentVersion\' +
В В 'Policies\System', True);
 //отключить свойства экрана
В reg.WriteInteger('NoDispCPL', 1);
В reg.CloseKey;
В end else begin
В reg:= TRegistry.Create;
В reg.RootKey:= HKEY_CURRENT_USER;
В reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\'+
В В 'Policies\System', True);
 //Восстановить свойства экрана
В reg.WriteInteger('NoDispCPL', 0);
В reg.CloseKey;
В end;
 //Для опции "Заблокировать реестр":
В if CheckBox3.Checked then begin
В reg:= TRegistry.Create;
В reg.RootKey:= HKEY_CURRENT_USER;
В reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\' +
В В 'Policies\System', True);
 //Заблокировать реестр
В reg.WriteInteger('DisableRegistryTools', 1);
В reg.CloseKey;
В end else begin
В reg:= TRegistry.Create;
В reg.RootKey:= HKEY_CURRENT_USER;
В reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\' +
В В 'Policies\System', True);
 //открыть доступ к реестру
В reg.WriteInteger('DisableRegistryTools', 0);
В reg.CloseKey;
В end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
 reg:= TRegistry.Create;//открываем реестр
 //настройки для текущего пользователя
В reg.RootKey:= HKEY_CURRENT_USER;
 reg.OpenKey('SYSTEM\CurrentControlSet\Services\Cdrom', False); //открываем раздел
 if reg.ValueExists('Autorun') then //если ключ существует
 if reg.readinteger('autorun') = 1 //и если он равен 1,
  then //то устанавливаем флажок первой опции
В В В CheckBox1.Checked:= True;
 reg.CloseKey;//закрываем реестр
 //Таким же образом проверяем остальные опции
 //Для опции "Отключить свойства экрана":
В reg:= TRegistry.Create;
В reg.RootKey:= HKEY_CURRENT_USER;
В reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\' +
В 'Policies\System', False);
В if reg.ValueExists('NoDispCPL') then
В if reg.ReadInteger('NoDispCPL') = 1 then CheckBox2.Checked:= True;
В reg.CloseKey;
 //для опции "Заблокировать реестр":
В reg:= TRegistry.Create;
В reg.RootKey:= HKEY_CURRENT_USER;
В reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\' +
В 'Policies\System', False);
В if reg.ValueExists('DisableRegistryTools') then
В if reg.ReadInteger('DisableRegistryTools') = 1 then CheckBox3.Checked:= True;
В reg.CloseKey;
end;
end.
⊚ Р’СЃРµ файлы проекта Рё исполняемый файл рассмотренной программы находятся РЅР° прилагаемом Рє РєРЅРёРіРµ компакт-РґРёСЃРєРµ РІ папке Chapter_12.