Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать запущен процесс или нет?


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 написано тобой, то это упростит задачу.


Наверх

Титульная страница Поиск, карта сайта Написать письмо