![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать запущен процесс или нет?
MAXHO © (2005-12-17 10:16:00)Здраствуйте.
Подскажите как можно узнать запущен процес или нет? Например программа следит за тем, что если приложение myapp.exe нету среди запущеных процессов то запускать его.
MAXHO (2005-12-17 16:14:00) [1]Можешь скинуть свой код7 Может я нахимичил не то что-то...
The_scorpion (2005-12-17 16:01:00) [2]
> Вот я и спрашиваю, все работает до тех пор пока курсором
> мышки не проводишь над формой прям мистика какаято. :)
У меня все работает, проверил.
Попробуй уменьшить интервал таймера.
MAXHO (2005-12-17 15:40:00) [3]Вот я и спрашиваю, все работает до тех пор пока курсором мышки не проводишь над формой прям мистика какаято. :)
The_scorpion (2005-12-17 15:31:00) [4]
> Вот когда отвожу мышку в сторону:
А мышка тут причем?
Digitman (2005-12-17 15:30:00) [5]
> Поставил это дело все на таймер
Для НТ есть более подходящий способ слежения за старт/стопом процессов
Он базируется на ф-ции режима ядра KeSetProcessNotifyRoutine, которая немедленно известит о произошедшем событии в списке активных процессов.
На wasm.ru на эту тему есть соотв.статья и демо-проект.
MAXHO (2005-12-17 15:26:00) [6]
> Pazitron_Brain © (17.12.05 15:23)
> А как ты выводишь список в лист бокс?
procedure TForm1.Timer1Timer(Sender: TObject);
Var
SH: THandle;
ppe: TProcessEntry32;
Num, i: Integer;
Full_Path, Exe_Name: array[0..259] of string;
begin
ListBox1.Clear;
SH := CreateToolHelp32SnapShot(Th32cs_SnapAll, 0);
ppe.dwSize:=sizeof(TProcessEntry32);
Process32First(SH, PPE);
Num:=0;
for i:=0 to 259 do
begin
Full_Path[Num]:=Full_Path[Num]+PPE.szExeFile[i];
Exe_Name[Num] := ExtractFileName(Full_Path[Num]);
end;
while Process32Next(SH, PPE) do
begin
inc(Num);
for i:=0 to 259 do
Full_Path[Num]:=Full_Path[Num]+PPE.szExeFile[i];
Exe_Name[Num] := ExtractFileName(Full_Path[Num]);
ListBox1.Items.Add(Exe_Name[Num]);
end;
i:=0; Num:=0;
CloseHandle (SH);
end;
MAXHO (2005-12-17 15:25:00) [7]Вот вроде нормально выводит
Memo1
System
smss.exe
csrss.exe
winlogon.exe
services.exe
lsass.exe
svchost.exe
svchost.exe
svchost.exe
svchost.exe
svchost.exe
spoolsv.exe
mdm.exe
svchost.exe
explorer.exe
ctfmon.exe
ISATRAY.EXE
alg.exe
Radmin.exe
HPBPRO.EXE
Icq.exe
msmsgs.exe
MyIE.exe
delphi32.exe
Project1.exe
Вот когда отвожу мышку в сторону:
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
]ô\x1I
Pazitron_Brain (2005-12-17 15:25:00) [8]или вот:
// Получение снимка состояния системы
hSnapshot := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
// Получене инфоpмации о пеpвом пpоцессе в списке
Process32First();
// Получение инфоpмации о следующем пpоцессе в списке
Далее в цикле Process32Next();
Pazitron_Brain (2005-12-17 15:23:00) [9]MAXHO © (17.12.05 15:20) [7]
А как ты выводишь список в лист бокс?
Pazitron_Brain (2005-12-17 15:22:00) [10]
function IsRunning(sName: string): boolean;
var
han: THandle;
ProcStruct: PROCESSENTRY32; // from "tlhelp32" in uses clause
sID: string;
begin
Result := false;
// Get a snapshot of the system
han := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if han = 0 then
exit;
// Loop thru the processes until we find it or hit the end
ProcStruct.dwSize := sizeof(PROCESSENTRY32);
if Process32First(han, ProcStruct) then
begin
repeat
sID := ExtractFileName(ProcStruct.szExeFile);
// Check only against the portion of the name supplied, ignoring case
if uppercase(copy(sId, 1, length(sName))) = uppercase(sName) then
begin
// Report we found it
Result := true;
Break;
end;
until not Process32Next(han, ProcStruct);
end;
// clean-up
CloseHandle(han);
end;
MAXHO (2005-12-17 15:20:00) [11]Проблема
Поставил это дело все на таймер, для проверки все процессы вывожу в ЛистБокс. Все нормально, но как только делаю что-то нарпимер отвожу мышку в сторону так появляються какието иерогливы, в чем проблема может быть?
The_scorpion (2005-12-17 15:09:00) [12]
> FindWindow
Это если имя окна совпадает с именем программы, что бывает не часто
...а знаешь, есть программы у которых окон вообще нет?
З.Ы. Смотрю я сейчас на имена процессов на своей машине и на имена их окон...и совпадений не вижу...:)))
Pazitron_Brain (2005-12-17 15:02:00) [13]Можно и проще:
if FindWindow(nil, 'myapp') <> 0 then // ищет программу по заголовку окна
ShowMessage('Myapp запущен!')
else
WinExec('myapp', SW_Restore);
MAXHO (2005-12-17 14:28:00) [14]Благодарю :)
The_scorpion (2005-12-17 14:16:00) [15]Блин...я такой бред написал...не Thread32First,Thread32Next, а Process32Next и Process32First
Запросто:
SH := CreateToolHelp32SnapShot(Th32cs_SnapAll, 0);
ppe.dwSize:=sizeof(TProcessEntry32);
Process32First(SH, PPE);
Num:=0;
for i:=0 to 259 do
Full_Path[Num]:=Full_Path[Num]+PPE.szExeFile[i];
Exe_Name[Num] := ExtractFileName(Full_Path[Num]);
while Process32Next(SH, PPE) do
begin
inc(Num);
for i:=0 to 259 do
Full_Path[Num]:=Full_Path[Num]+PPE.szExeFile[i];
Exe_Name[Num] := ExtractFileName(Full_Path[Num]);
end;
В Exe_Name будут имена всех процессов.
MAXHO (2005-12-17 11:58:00) [16]Спасибо.
А можно кусок кода? :)
The_scorpion (2005-12-17 11:17:00) [17]Нужно сделать мгновенный снимок памяти(CreateToolhelp32Snapshot ).
И просмотреть все процессы в этом снимки(Thread32First,Thread32Next), если ты не найдешь в нем myapp.exe, то запустишь его.
З.Ы. Если приложение myapp.exe написано тобой, то это упростит задачу.