Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2010, 19:25   #1
NoName_emaNoN
Форумчанин
 
Аватар для NoName_emaNoN
 
Регистрация: 15.11.2007
Сообщений: 229
По умолчанию Узнать когда закроется программа

Добрый день!

У меня такой вопрос: Из своей программы я запускаю ещё одну, exe файл. Нужно узнать когда она отработает, и после её закрытия выполнить определённое действие.

Если есть готовые наработки, буду рад.
Компьютер не подчиняется законам физики: глюки возникают из ниоткуда, файлы исчезают в никуда, а вес измеряется в метрах.
NoName_emaNoN вне форума Ответить с цитированием
Старый 17.07.2010, 19:28   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Мой Watcher. Следит за открытым проектом в Lazarus и архивирует его после закрытия среды.

Код:
program Watcher;

uses
  ShellAPI, {SysUtils,} Windows;

Var
 Look   : Boolean = FALSE;
 Gotcha : Boolean = FALSE;
 Hand   : Integer;
Begin
 While True Do
  Begin
   (* Search for Lazarus *)
   Hand := 0;
   Hand := FindWindow('Window','Lazarus IDE v0.9.28.2 бета - Finder.lpi');
   Gotcha := (Hand <> 0);
   If (Look) And Not(Gotcha) Then
    Begin
     ShellExecute(0,'Open','D:\Programs\7-Zip\Arc.bat', Nil, Nil, SW_HIDE);
     Look := FALSE;
    End
   Else
    If Not(Look) And (Gotcha) Then
     Begin
      Look := TRUE;
     End;
   Sleep(10 * 1000);
  End;
End.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 17.07.2010, 19:29   #3
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

http://pblog.ru/lab/?p=231
или проверять наличия окна вашего exe... Если окно есть - значит прога еще работает, а если нет, тогда выполняйте свое действие...
W0LF вне форума Ответить с цитированием
Старый 17.07.2010, 19:36   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Код:
var pi: PROCESS_INFORMATION;

CreateProcess(...)
WaitForSingleObject(pi.hProcess, INFINITE);
Можно в отдельном потоке, как здесь (бинарник не запускай, там win32.induc )
пыщь

Последний раз редактировалось JTG; 17.07.2010 в 19:52. Причина: поправочка
JTG вне форума Ответить с цитированием
Старый 17.07.2010, 20:51   #5
NoName_emaNoN
Форумчанин
 
Аватар для NoName_emaNoN
 
Регистрация: 15.11.2007
Сообщений: 229
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Код:
var pi: PROCESS_INFORMATION;

CreateProcess(...)
WaitForSingleObject(pi.hProcess, INFINITE);
Можно в отдельном потоке, как здесь (бинарник не запускай, там win32.induc )
Спасибо большое! С CreateProcess так и не разобрался, но функция очень мощная видимо, спасибо!

Реализовал методом по ссылке http://pblog.ru/lab/?p=231, спасибо большое!
Компьютер не подчиняется законам физики: глюки возникают из ниоткуда, файлы исчезают в никуда, а вес измеряется в метрах.
NoName_emaNoN вне форума Ответить с цитированием
Старый 17.07.2010, 23:35   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у меня же недавно тема была...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.07.2010, 11:07   #7
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

Вот кусочек кода из одной моей программки... Ищется файлик по шаблону и запускается, затем отслеживается окончание работы запущенной программы...
Код:
var
  SlExe:TStringList;
  hSnapshoot: THandle;
  pe32: TProcessEntry32;
  jmap:integer;

Begin
  SlExe:=TStringList.Create;
  SlExe.Duplicates:=dupIgnore;
  FileMap:='';
  FindMap.Criteria.Files.FileName:='*.exe';  //задаю шаблон поиска файлов
  //задаю каталог поиска программы *Map.exe
  FindMap.Criteria.Files.Location:=ExeDir;
  //устанавливаю аттрибуты поиска
  FindMap.Criteria.Attribute.Attributes:=
  FindMap.Criteria.Attribute.Attributes-[ffHidden];
  fndMap:=false;
  FindMap.Execute;
  if fndMap then
    begin
      MainForm.WindowState:=wsMinimized;
      ShellExecute(MainForm.Handle,nil,PChar(FileMap),nil,nil,SW_RESTORE);
      FileMap:=UpperCase(ExtractFileName(FileMap))
    end;
  while fndMap do
    begin
      Sleep(2000);
      SlExe.Clear;
      SlExe.Sorted:=false;
      hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      pe32.dwSize := SizeOf(TProcessEntry32);
      if (Process32First(hSnapshoot, pe32)) then
        repeat
          Application.ProcessMessages;
          SlExe.Add(UpperCase(StrPas(pe32.szExeFile)))
        until not Process32Next(hSnapshoot,pe32);
      CloseHandle(hSnapshoot);
      SlExe.Sorted:=true;
      fndMap:=SlExe.Find(FileMap,jmap)
    end;
  SlExe.Free;
  MainForm.WindowState:=wsMaximized;
End;
Для поиска требуемой программы использую сторонний коипонент FindFile, но это к задаче не относится...
Перемешивай дело с бездельем и не сойдешь с ума...

Последний раз редактировалось Grag; 18.07.2010 в 11:10.
Grag вне форума Ответить с цитированием
Старый 18.07.2010, 12:33   #8
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Можно через дескриптор оконного интерфейса HANDLE. Или через ловушку виндовс.
Функция объявлена след. образом:
HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId);
И куча флагов к ней.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как получить список запущенных программ и узнать когда и во сколько какая была запущена Аlex Общие вопросы C/C++ 8 04.12.2009 17:18
как заставить keyEvent работать когда программа в фоновом режиме (WaveLib, keybinding) 2befine Общие вопросы C/C++ 1 01.12.2009 21:10
Как узнать когда был изменен (создан) интерфейс версии IPv6. Crazyman Работа с сетью в Delphi 0 15.12.2008 00:51
как мне узнать когда одновременно нажаты две клавиши vitalik007 Помощь студентам 8 11.10.2007 17:13
Как узнать когда браузер скачивает, а когда нет? iPod Работа с сетью в Delphi 1 07.05.2007 15:16