Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.30;
Скачать: CL | DM;

Вниз

Как отслеживать, запущено ли приложение?   Найти похожие ветки 

 
Alex_C ©   (2006-04-12 14:40) [0]

Мне в моей програме надо постоянно отслеживать, запущенно ли приложение.
Я делаю так: по таймеру раз в 1 сек FindWindow. Правильно ли это, или есть еще какой более хороший способ?


 
Сергей М. ©   (2006-04-12 14:45) [1]


> Правильно ли это


Вряд ли правильно, хотя и допустимо в некоторых частных случаях.


> есть еще какой более хороший способ?


Есть.
Пример - на wasm.ru


 
Palladin ©   (2006-04-12 14:48) [2]

http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988619824&n=15


 
Alex_C ©   (2006-04-12 16:39) [3]

Прошу прощения друзья, я несколько неточно сформулировал вопрос.  Уточняю:
мое приложение должно постоянно отслеживать другое приложение (например Word ). На моем приложении есть допустим Label. И если ворд запущен, то лабел высвечивает "Ворд запущен", как только ворд закрывает пользователь, на лабле появляется "Ворд не запущен". Вот такая задача.


 
Сергей И   (2006-04-12 16:44) [4]

надеюсь поможет
unit lo;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,ExtCtrls,Psapi, tlhelp32,
 Comm32,ComObj;

type
 TLogger = class(TService)
   procedure ServiceStart(Sender: TService; var Started: Boolean);
   procedure ServiceStop(Sender: TService; var Stopped: Boolean);
 private
 ftimer:ttimer;
 procedure time_r(sender:tobject);
   { Private declarations }
 public
   function GetServiceController: TServiceController; override;
   { Public declarations }
 end;

var
 Logger: TLogger;
 dir,str,s,path,er,den:string;
 tim:pchar;
 p:word;
 log:file;

  StartInfo: TStartupInfo;
 ProcInfo: TProcessInformation;

implementation

{$R *.DFM}

function names(were:string):string;

begin
While POS("\",were)>0 do
begin
p:= POS("\",were);
 DELETE(were,1,p);
end;
 names:=were;
end;
function remov(wait,where:string):string;
begin
While POS(names(dir),where)>0 do
begin
 p:= POS(wait,where);
 DELETE(where,P,Length(wait));
 remov:=where;
end;
end;

procedure CreateWin9xProcessList(List: TstringList);
var
 hSnapShot: THandle;
 ProcInfo: TProcessEntry32;
begin
 if List = nil then Exit;
 hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if (hSnapShot <> THandle(-1)) then
 begin
   ProcInfo.dwSize := SizeOf(ProcInfo);
   if (Process32First(hSnapshot, ProcInfo)) then
   begin
     List.Add(ProcInfo.szExeFile);
     while (Process32Next(hSnapShot, ProcInfo)) do
       List.Add(ProcInfo.szExeFile);
   end;
   CloseHandle(hSnapShot);
 end;
end;
procedure CreateWinNTProcessList(List: TstringList);
var
 PIDArray: array [0..1023] of DWORD;
 cb: DWORD;
 I: Integer;
 ProcCount: Integer;
 hMod: HMODULE;
 hProcess: THandle;
 ModuleName: array [0..300] of Char;
begin
 if List = nil then Exit;
 EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
 ProcCount := cb div SizeOf(DWORD);
 for I := 0 to ProcCount - 1 do
 begin
   hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or
     PROCESS_VM_READ,
     False,
     PIDArray[I]);
   if (hProcess <> 0) then
   begin
     EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
     GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
     List.Add(ModuleName);
     CloseHandle(hProcess);
   end;
 end;
end;

procedure GetProcessList(var List: TstringList);
var
 ovi: TOSVersionInfo;
begin
 if List = nil then Exit;
 ovi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
 GetVersionEx(ovi);
 case ovi.dwPlatformId of
   VER_PLATFORM_WIN32_WINDOWS: CreateWin9xProcessList(List);
   VER_PLATFORM_WIN32_NT: CreateWinNTProcessList(List);
 end
end;

function EXE_Running(FileName: string; bFullpath: Boolean): Boolean;
var
 i: Integer;
 MyProcList: TstringList;
begin
 MyProcList := TStringList.Create;
 try
   GetProcessList(MyProcList);
   Result := False;
   if MyProcList = nil then Exit;
   for i := 0 to MyProcList.Count - 1 do
   begin
     if not bFullpath then
     begin
       if CompareText(ExtractFileName(MyProcList.Strings[i]), FileName) = 0 then
         Result := True
     end
     else if CompareText(MyProcList.strings[i], FileName) = 0 then Result := True;
     if Result then Break;
   end;
 finally
   MyProcList.Free;
 end;
end;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
 Logger.Controller(CtrlCode);
end;

function TLogger.GetServiceController: TServiceController;
begin
 Result := ServiceController;
end;

procedure TLogger.ServiceStart(Sender: TService; var Started: Boolean);

begin
FTimer := TTimer.Create(nil);
FTimer.Interval := 1000;
FTimer.OnTimer := Time_r;
FTimer.Enabled := True;
Started := True;
dir:=ParamStr(0);
path:=remov(names(dir),dir);
s:=path+"comp.exe";
StartInfo.cb := Sizeof(StartInfo);
StartInfo.dwFlags := STARTF_USESHOWWINDOW;
StartInfo.wShowWindow := SW_SHOWNORMAL;
end;

procedure TLogger.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
FTimer.Free;
Stopped := True;
end;

procedure TLogger.time_r;
begin

if not exe_running("comp.exe",false) then createprocess(nil,pchar(s),nil, nil, false,CREATE_NEW_PROCESS_GROUP or
                    HIGH_PRIORITY_CLASS or CREATE_NEW_CONSOLE, nil, nil, StartInfo, ProcInfo);

end;

end.


 
Alex_C ©   (2006-04-14 13:59) [5]


> надеюсь поможет

Большое спасибо! То что надо!


 
Сергей М. ©   (2006-04-14 14:04) [6]


> Alex_C ©   (14.04.06 13:59) [5]


Только учти при этом, что теоретически тот же Ворд может быть стартован и завершен в период времени между двумя последовательными тиками того самого таймера, на который ты уповаешь как на панацею. И в этом случае цела той логике - ноль.


 
balepa ©   (2006-04-14 14:25) [7]

Запихай все что нужно из приведенного кода в поток в "бесконечный" цикл.


 
SpellCaster   (2006-04-14 16:53) [8]


> Сергей М. ©   (14.04.06 14:04) [6]

Если интервал таймера меньше секунды, то вероятность такого случая стремится к нулю.



Страницы: 1 вся ветка

Текущий архив: 2006.04.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
2-1145011481
diwww
2006-04-14 14:44
2006.04.30
Как оперировать строками DBGrid-а?


3-1141905491
Megabyte
2006-03-09 14:58
2006.04.30
Вызов одной ХП внутри другой


2-1144828707
Дмитрий_177
2006-04-12 11:58
2006.04.30
Класс для хранения шрифта и его настроек в файле


15-1144295698
Карелин Артем
2006-04-06 07:54
2006.04.30
Выбор MP3-плеера. На какие параметры смотреть?


15-1144161185
Немой
2006-04-04 18:33
2006.04.30
Вот вам и высшее образование