В этой статье поговорим о том, как написать собственную программу на Delphi, которая в заданное время будет запускать определенные процессы, то есть программы. Да, в сети, возможно, много таких программ, но зато Вы подчеркнете для себя что-то новое и интересное. Данную программу, я вроде бы писал под заказ, не помню, сколько мне за нее заплатили, поэтому раз мне за нее заплатили, то исходники выкладывать не буду.
Суть программы (по ТЗ заказчика) заключается в следующем: формируется список приложений, которые необходимо запускать, далее устанавливаем время, начиная с которого необходимо запускать процессы (приложения) и как только первое приложение запустить, в нем поработает пользователь и закроет, то запускается следующее, которое идет в списке за ним и так далее (до конца списка, сформированных приложений).
Создадим проект в Delphi и разместим на форме следующие компоненты:
- TListBox – 2 шт
- TEdit – 2 шт
- TMaskEdit
- TButton – 7 шт
- TLabel – 3 шт
- TOpendialog
- TTimer – 3 шт
Первый TListBox понадобится нам для того, чтобы отображать название приложений, а второй (который не виден) содержать полный путь приложения.
Теперь давайте объявим запись и создадим массив записей, который будет содержать список имя и путь процесса, который необходимо запустить, у меня вышло следующее:
Type
Process=record
name_process:WideString;
Patch_proccess:WideString;
end;
Массив a:array[1..100000] of Process;
Все, теперь на событие OnClick кнопки Добавить пишем следующий код:
procedure TForm1.Button5Click(Sender: TObject);
begin
try
if (Trim(Edit1.Text)='') or (Trim(Edit2.Text)='') then
exit;
a[i].name_process:=Edit2.Text;
a[i].Patch_proccess:=Edit1.Text;
inc(i);
ListBox1.Items.Add(Edit1.Text);
ListBox2.Items.Add(Edit2.Text);
Edit1.Clear;
Edit2.Clear;
except
on e:Exception do
end;
end;
То есть, формируем наш массив данными и добавляем в TListBox значения. На событие OnClick кнопки очистить я написал следующий код:
procedure TForm1.Button6Click(Sender: TObject);
begin
Edit1.Clear;
Edit2.Clear;
end;
На событие OnClick кнопки «Удалить» я написал следующий код:
procedure TForm1.Button7Click(Sender: TObject);
var
nach,j:integer;
begin
try
nach:=ListBox2.ItemIndex;
for j:=nach+1 to i do
begin
a[j].name_process:=a[j+1].name_process;
a[j].Patch_proccess:=a[j+1].Patch_proccess;
end;
dec(i);
ListBox1.Items.Delete(ListBox2.ItemIndex);
ListBox2.Items.Delete(ListBox2.ItemIndex);
except
on e:Exception do
end;
end;
То есть помимо того, что нам надо удалить данные из TListBox, нам необходимо еще и удалить данные из нашего массива.
Теперь давайте выделим наш таймер, который по заданному времени будет запускать наши процессы, для этих целей укажем в свойстве Interval – 1, а на событие OnTimer я написал следующий код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
process:string;
begin
try
if k>=i then
begin
Timer1.Enabled:=False;
Timer2.Enabled:=False;
exit;
end;
if (StrToTime(MaskEdit1.Text)<=Time) then
begin
process:=ExtractFileName(a[k].Patch_proccess);
ShellExecute(Handle,nil,Pchar(process),'','',SW_SHOW);
Timer1.Enabled:=False;
Timer2.Enabled:=True;
end;
except
on e:Exception do
end;
end;
Тут все просто, в MaskEdit считываем время, когда нам необходимо запускать наше приложение и дальше получаем имя процесса и с помощью функции ShellExecute его запускаем.
Теперь нам необходимо отследить, когда пользователь закроет текущий процесс, чтобы запустить следующий (если он имеется в списке), для этих целей нам понадобиться 2-й таймер, в котором в свойстве Interval также выставляем – 1 и на событие OnTimer пишем следующий код:
procedure TForm1.Timer2Timer(Sender: TObject);
var
process:string;
begin
try
process:=ExtractFileName(a[k].Patch_proccess);
if IsProcesssRun(LowerCase(process))<>True then
begin
inc(k);
if k<=i then
begin
Timer2.Enabled:=False;
Timer1.Enabled:=True;
end;
end;
except
on e:Exception do
end;
end;
Все очень просто тут, также получаем имя процесса и с помощью функции IsProccesRun определяем запущен ли еще процесс, если запущен, то ничего не делаем, если не запущен, то активируем наш таймер, который запускает процессы, если имеются в списке. Функция IsProccesRun является пользовательской и выглядит у меня следующим образом:
Function IsProcesssRun(processname:string):boolean;
var Snapshot:Thandle;
proc:TprocessEntry32;
begin
result:=false;
Snapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if snapshot=INVALID_HANDLE_VALUE then exit;
proc.dwSize:=sizeof(TprocessEntry32);
if Process32First(snapshot,proc) then
repeat
if proc.szExeFile=processname then
begin
result:=true;
break;
end;
until not process32next(snapshot,proc);
closehandle(snapshot);
end;
В своем проекте я подключал в uses следующие дополнительные модули:
- Shellapi
- TLHELP32
Вот и все, такая возможно интересная и совсем простая программа у меня получилась, я выкладываю exe-файл, который ограничен только на 1 минуты работы, можете посмотреть, как работает, и сделать свою собственную программу, усовершенственную.
Также советуем почитать на PressDev.RU
Короткая ссылка: http://pressdev.ru/?p=257