Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.011 c
5-1130411808
VadimMX
2005-10-27 15:16
2006.04.30
Редакторы компонентов


2-1144741889
Pretender
2006-04-11 11:51
2006.04.30
Пожалуйста, помогите организовать цикл!


2-1144869929
Системщик
2006-04-12 23:25
2006.04.30
Степень


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


2-1145016343
Ezorcist
2006-04-14 16:05
2006.04.30
Как узнать аськи-код символа?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский