Delphi And Прикол
Delphi And Прикол
Привет-привет, уважаемый читатель! Я смотрю, повеселиться любишь. Понимаю. Без приколов и не туды, и не сюды. Ладно, не все так печально, если у тебя имеется Delphi и немного мозгов, а еще фантазию не забудь. Я вот чего надумал: содрать рабочий стол в bmp-файл, через реестр сделать этот файл обоями для железного друга, там же (в реестре) заблокировать доступ к свойствам экрана и убрать все значки с рабочего стола. Прикинь, как твои друзья (подруги) будут по крысе тыркать пальцами, сделав при этом изумленный вид, мол, Windows поломался. Ладно, давай за дело.
Запускай Delphi. Извратись на форме, сделав нечто похожее на это:
Тут два BitBtn (Страница Additional). Давай сделаем как взрослые дядьки. Свойство Caption как изменить у компонентов ты уже умеешь, а на что — догадался. Свойство Name у Form1 измени на fmMain, у BitBtn1 — на bbStart, у BitBtn2 — на bbFinish. Вообще, давать имена следует со смыслом. И еще, имеется негласное правило, которое гласит (немасленое масло), что имена должны начинаться с двухбуквенного префикса (означающего тип компонента или его свойства). Ну, к примеру, bb — от BitBtn. Ладно, проехали. Создай обработчик OnClick для bbStart и вставь туда все, что сочтешь нужным из следующего листинга:
procedure TfmMain.bbStartClick (Sender: TObject);
var
Canvas:TCanvas;
ScreenDC:HDC;
Bitmap:TBitmap;
Reg:TRegistry;
s:string;
begin
fmMain.Hide;//прячу окно своей программы
ScreenDC:= GetDC(0);
Canvas:=TCanvas.Create;
Bitmap:=TBitmap.Create;
Bitmap.Height:=Screen.Height;
Bitmap.Width:=Screen.Width;//устанавливаю размеры
Canvas.Handle:=ScreenDC;
Bitmap.Canvas.Copyrect(Rect(0,0, Screen.Width,Screen.Height),
Canvas, Rect(0,0,Screen.Width, Screen.Height));//копирую с канвы Canvas в канву Bitmap
Bitmap.SaveToFile('Fon1.bmp');// сохраняю картинку
ReleaseDC(0,ScreenDC);
Canvas.Free;
Bitmap.free;
fmMain.Show;//показываю окно своей проги
//////////////////////////////////
Reg:= TRegistry.Create;
try
Reg.RootKey:= HKEY_CURRENT_USER;
if Reg.OpenKey('\Software\Micro-soft\Windows\CurrentVersion\Policies\Explorer',
True)
then Reg.WriteInteger('NoDesktop',1);// если ключ открыт, то добавить параметр 'NoDesktop'
if Reg.OpenKey('\Software\Micro-soft\Windows\CurrentVersion\Policies\System',
True)
then Reg.WriteInteger('NoDispCpl',1);
s:=GetCurrentDir+'\fon1.bmp';
if Reg.OpenKey('\Control Panel\ Desktop',
True)
then Reg.WriteString('Wallpaper',s);
finally
Reg.CloseKey;
Reg.Free;
end;
end;{TfmMain.bbStartClick}
Здесь у меня три объекта: Canvas, Bitmap, Reg и две переменные: ScreenDC:Hdc, s:string. Сначала я получаю контекст окна при помощи процедуры GetDC. В скобках у меня номер окна, у которого я получаю контекст. Если 0, то это экран. Потом я создаю канву (холст), на которой можно рисовать (Canvas:=TCanvas.Create;) и объект для работы с растровой графикой (Bitmap:=TBitmap.Create;).
Далее я устанавливаю размеры у Bitmap, а т.к. мы хотим содрать Desktop, то и размеры соответствующие (как у экрана). Необходимо связать канву и контекст экрана, для этого я дескриптор (мол, указатель, т.е. Canvas, указывает на экран, и можно работать прямо с экраном: рисовать, копировать содержимое и т.д.) у канвы устанавливаю на ScreenDC.
procedure CopyRect(Dest:TRect, Canvas:TCanvas, Source:TRect) — копирует изображение Source канвы Canvas в участок Dest текущей канвы (у нас Bitmap.Canvas). Ты, наверное, не знаешь, что за тип TRect. Это поправимо. TRect — составной тип, у которого четыре поля для хранения координат прямоугольной области.
TRect = record
Left, Top, Right, Bottom: Integer;
end;
procedure Rect — преобразует четыре координаты в тип TRec.
После всего этого колдовства предлагаю сохранить изображение с канвы у Bitmap в файл (Fon1.bmp). В следующих трех строках я освобождаю ресурсы (память), которые занимал своими переменными (объектами). Забыл тебе сказать, что я прячу окно программы на время копирования экрана.
Так, изображение у нас есть, теперь давай поработаем с реестром. В Delphi есть объект класса TRegistry спецом для работы с системным реестром окошек. Чтобы нам заюзать этот объект, необходимо его создать, что я и делаю.
property RootKey:HKEY — содержит имя корневого ключа.
function OpenKey(const Key:String; CanCreate:Boolean):boolean — открывает существующий или создает и открывает новый ключ с именем Key и возвращает True, если все OK. CanCreate — разрешает/запрещает создание ключа при его отсутствии.
procedure WriteXXXX(const Name:String; Value:XXXX) — записывает в параметр с именем Name данные типа XXXX.
NoDesktop:DWORD — разрешает/запрещает отображение десктопа, а нам это и надо (убрать иконки). NoDispCpl:DWORD — разрешает/запрещает доступ к свойствам экрана (чтобы жертва не могла поменять обои). При помощи процедуры GetCurrentDir я получаю путь к каталогу, с которым работает моя прога (по дефолту — каталог, в котором прога находится). Прибавляю имя графического файла (Fon1.bmp) и пишу в реестре его полный путь как wallpaper. Все! Теперь заканчиваю работу с реестром и освобождаю ресурсы.
Здесь приведен обработчик OnClick для второй пимпы. Я думаю, что тебе будет все понятно, если ты внимательно читал статью.
procedure TfmMain.bbFinishClick (Sender: TObject);
var
Reg:TRegistry;
begin
Reg:= TRegistry.Create;
try
Reg.RootKey:= HKEY_CURRENT_USER;
if Reg.OpenKey('\Software\Micro-soft\Windows\CurrentVersion\Policies\Explorer',
True)
then Reg.WriteInteger('NoDesktop',0);//разрешаю десктоп
if Reg.OpenKey('\Software\Micro-soft\Windows\CurrentVersion\Policies\System',
True)
then Reg.WriteInteger('NoDispCpl',0);// разрешаю доступ к свойствам экрана
if Reg.OpenKey('\Control Panel\ Desktop',
True)
then Reg.WriteString('Wallpaper','') ;//фонового рисунка нет
finally
Reg.CloseKey;
Reg.Free;
end;
end;
Можешь компилить, только добавь registry в Uses. Этот модуль необходим для юзания TRegistry (согласись, не в каждой проге используешь реестр).
Uses
Windows, Messages, SysUtils, Clas-ses, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls,registry;
Теперь запускай эту прогу на компьютере жертвы. Кстати, тачку нужно перезагрузить, чтобы Windows загрузился с новыми параметрами! Только не заплюй экран от смеха!
За сегодня ты научился работать с реестром, что очень необходимо для Win-кодинга. Можешь написать Windows-настраивалку — конечно, если знаешь секреты реестра.
Margo
Привет-привет, уважаемый читатель! Я смотрю, повеселиться любишь. Понимаю. Без приколов и не туды, и не сюды. Ладно, не все так печально, если у тебя имеется Delphi и немного мозгов, а еще фантазию не забудь. Я вот чего надумал: содрать рабочий стол в bmp-файл, через реестр сделать этот файл обоями для железного друга, там же (в реестре) заблокировать доступ к свойствам экрана и убрать все значки с рабочего стола. Прикинь, как твои друзья (подруги) будут по крысе тыркать пальцами, сделав при этом изумленный вид, мол, Windows поломался. Ладно, давай за дело.
Запускай Delphi. Извратись на форме, сделав нечто похожее на это:
Тут два BitBtn (Страница Additional). Давай сделаем как взрослые дядьки. Свойство Caption как изменить у компонентов ты уже умеешь, а на что — догадался. Свойство Name у Form1 измени на fmMain, у BitBtn1 — на bbStart, у BitBtn2 — на bbFinish. Вообще, давать имена следует со смыслом. И еще, имеется негласное правило, которое гласит (немасленое масло), что имена должны начинаться с двухбуквенного префикса (означающего тип компонента или его свойства). Ну, к примеру, bb — от BitBtn. Ладно, проехали. Создай обработчик OnClick для bbStart и вставь туда все, что сочтешь нужным из следующего листинга:
procedure TfmMain.bbStartClick (Sender: TObject);
var
Canvas:TCanvas;
ScreenDC:HDC;
Bitmap:TBitmap;
Reg:TRegistry;
s:string;
begin
fmMain.Hide;//прячу окно своей программы
ScreenDC:= GetDC(0);
Canvas:=TCanvas.Create;
Bitmap:=TBitmap.Create;
Bitmap.Height:=Screen.Height;
Bitmap.Width:=Screen.Width;//устанавливаю размеры
Canvas.Handle:=ScreenDC;
Bitmap.Canvas.Copyrect(Rect(0,0, Screen.Width,Screen.Height),
Canvas, Rect(0,0,Screen.Width, Screen.Height));//копирую с канвы Canvas в канву Bitmap
Bitmap.SaveToFile('Fon1.bmp');// сохраняю картинку
ReleaseDC(0,ScreenDC);
Canvas.Free;
Bitmap.free;
fmMain.Show;//показываю окно своей проги
//////////////////////////////////
Reg:= TRegistry.Create;
try
Reg.RootKey:= HKEY_CURRENT_USER;
if Reg.OpenKey('\Software\Micro-soft\Windows\CurrentVersion\Policies\Explorer',
True)
then Reg.WriteInteger('NoDesktop',1);// если ключ открыт, то добавить параметр 'NoDesktop'
if Reg.OpenKey('\Software\Micro-soft\Windows\CurrentVersion\Policies\System',
True)
then Reg.WriteInteger('NoDispCpl',1);
s:=GetCurrentDir+'\fon1.bmp';
if Reg.OpenKey('\Control Panel\ Desktop',
True)
then Reg.WriteString('Wallpaper',s);
finally
Reg.CloseKey;
Reg.Free;
end;
end;{TfmMain.bbStartClick}
Здесь у меня три объекта: Canvas, Bitmap, Reg и две переменные: ScreenDC:Hdc, s:string. Сначала я получаю контекст окна при помощи процедуры GetDC. В скобках у меня номер окна, у которого я получаю контекст. Если 0, то это экран. Потом я создаю канву (холст), на которой можно рисовать (Canvas:=TCanvas.Create;) и объект для работы с растровой графикой (Bitmap:=TBitmap.Create;).
Далее я устанавливаю размеры у Bitmap, а т.к. мы хотим содрать Desktop, то и размеры соответствующие (как у экрана). Необходимо связать канву и контекст экрана, для этого я дескриптор (мол, указатель, т.е. Canvas, указывает на экран, и можно работать прямо с экраном: рисовать, копировать содержимое и т.д.) у канвы устанавливаю на ScreenDC.
procedure CopyRect(Dest:TRect, Canvas:TCanvas, Source:TRect) — копирует изображение Source канвы Canvas в участок Dest текущей канвы (у нас Bitmap.Canvas). Ты, наверное, не знаешь, что за тип TRect. Это поправимо. TRect — составной тип, у которого четыре поля для хранения координат прямоугольной области.
TRect = record
Left, Top, Right, Bottom: Integer;
end;
procedure Rect — преобразует четыре координаты в тип TRec.
После всего этого колдовства предлагаю сохранить изображение с канвы у Bitmap в файл (Fon1.bmp). В следующих трех строках я освобождаю ресурсы (память), которые занимал своими переменными (объектами). Забыл тебе сказать, что я прячу окно программы на время копирования экрана.
Так, изображение у нас есть, теперь давай поработаем с реестром. В Delphi есть объект класса TRegistry спецом для работы с системным реестром окошек. Чтобы нам заюзать этот объект, необходимо его создать, что я и делаю.
property RootKey:HKEY — содержит имя корневого ключа.
function OpenKey(const Key:String; CanCreate:Boolean):boolean — открывает существующий или создает и открывает новый ключ с именем Key и возвращает True, если все OK. CanCreate — разрешает/запрещает создание ключа при его отсутствии.
procedure WriteXXXX(const Name:String; Value:XXXX) — записывает в параметр с именем Name данные типа XXXX.
NoDesktop:DWORD — разрешает/запрещает отображение десктопа, а нам это и надо (убрать иконки). NoDispCpl:DWORD — разрешает/запрещает доступ к свойствам экрана (чтобы жертва не могла поменять обои). При помощи процедуры GetCurrentDir я получаю путь к каталогу, с которым работает моя прога (по дефолту — каталог, в котором прога находится). Прибавляю имя графического файла (Fon1.bmp) и пишу в реестре его полный путь как wallpaper. Все! Теперь заканчиваю работу с реестром и освобождаю ресурсы.
Здесь приведен обработчик OnClick для второй пимпы. Я думаю, что тебе будет все понятно, если ты внимательно читал статью.
procedure TfmMain.bbFinishClick (Sender: TObject);
var
Reg:TRegistry;
begin
Reg:= TRegistry.Create;
try
Reg.RootKey:= HKEY_CURRENT_USER;
if Reg.OpenKey('\Software\Micro-soft\Windows\CurrentVersion\Policies\Explorer',
True)
then Reg.WriteInteger('NoDesktop',0);//разрешаю десктоп
if Reg.OpenKey('\Software\Micro-soft\Windows\CurrentVersion\Policies\System',
True)
then Reg.WriteInteger('NoDispCpl',0);// разрешаю доступ к свойствам экрана
if Reg.OpenKey('\Control Panel\ Desktop',
True)
then Reg.WriteString('Wallpaper','') ;//фонового рисунка нет
finally
Reg.CloseKey;
Reg.Free;
end;
end;
Можешь компилить, только добавь registry в Uses. Этот модуль необходим для юзания TRegistry (согласись, не в каждой проге используешь реестр).
Uses
Windows, Messages, SysUtils, Clas-ses, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls,registry;
Теперь запускай эту прогу на компьютере жертвы. Кстати, тачку нужно перезагрузить, чтобы Windows загрузился с новыми параметрами! Только не заплюй экран от смеха!
За сегодня ты научился работать с реестром, что очень необходимо для Win-кодинга. Можешь написать Windows-настраивалку — конечно, если знаешь секреты реестра.
Margo
Компьютерная газета. Статья была опубликована в номере 50 за 2002 год в рубрике программирование :: delphi