Текущий архив: 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.47 MB
Время: 0.013 c