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

Вниз

Снова процессы   Найти похожие ветки 

 
Handle   (2006-03-12 12:20) [0]

Помогите решить такой вопрос. Ловлю появление нового процесса.

procedure TForm1.Timer1Timer(Sender: TObject);
var
i: integer;
hSnapShot:     THandle;
uProcess:      PROCESSENTRY32;
r:             longbool;
begin
i:= 0;
hSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
uProcess.dwSize := Sizeof(uProcess);
if(hSnapShot<>0)then
begin
r:=Process32First(hSnapShot, uProcess);
while r <> false do
begin
i:= i + 1 ;
r:=Process32Next(hSnapShot, uProcess);
end;
end;
if i <> ListView1.Items.Count then
Чёнить сделать например обновить список в ListView1 ;
end;


А как получить имя последнего запущенного процесса ?

if i > ListView1.Items.Count then
Как получить имя последнего запущенного процесса ? ;
end;


 
begin...end ©   (2006-03-12 14:55) [1]

Открывать процессы и вызывать GetProcessTimes. Смотреть на время запуска.


 
Handle   (2006-03-12 15:17) [2]


> Открывать процессы и вызывать GetProcessTimes. Смотреть
> на время запуска.


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

if i > ListView1.Items.Count then
...
end;


 
begin...end ©   (2006-03-12 15:20) [3]

> Handle   (12.03.06 15:17) [2]

Для всех процессов получить время создания. Тот процесс, у которого наиболее позднее время создания, и есть последний запущенный.


 
Handle   (2006-03-12 15:30) [4]


> > Handle   (12.03.06 15:17) [2]
> Для всех процессов получить время создания. Тот проце...
>

Например этот список  будет у меня в какомнить буфере я же невижу его визуально.
Как мне сравнить полученный список на предмет времени создания  ?


 
begin...end ©   (2006-03-12 15:37) [5]

> Handle   (12.03.06 15:30) [4]

Причём здесь визуальный список?

Вы после создания snapshot"а получаете в цикле идентификаторы процессов? Получаете.

Можете в том же цикле попытаться открыть каждый процесс по его идентификатору, чтобы получить его дескриптор? Можете.

Можете вызвать для полученного дескриптора GetProcessTimes, чтобы узнать время создания конкретного процесса? Можете.

Можете выяснить, какое из полученных времён создания наибольшее? Можете.

Так в чём проблема-то?

А лучше скажите, в чём задача. И для чего нужно "ловить появление нового процесса".


 
Handle   (2006-03-12 15:48) [6]


> Можете выяснить, какое из полученных времён создания наибольшее?
>  Можете.


В этом то у меня и проблемма я просто не знаю как это сделать?


> А лучше скажите, в чём задача. И для чего нужно "ловить
> появление нового процесса".


Загружаю в TListView список процессов, при появлении нового процесса
можно конечно просто обновить весь TListView , мне нужно просто вставить один пункт с именем последнего появившегося процесса.

procedure ListProcesses;
var
ExePath:       array[0..127] of Char;
A:             array[0..127] of Char;
ProcessHandle: THandle;
hSnapShot: THandle;
lppe: TProcessEntry32;
hIcon: THandle;
Count: Integer;
pmc: PPROCESS_MEMORY_COUNTERS;
  cb: Integer;
procedure _FillList;
 begin
   with Form1.ListView1.Items.Add, lppe do
    begin
     ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, lppe.th32ProcessID);
     GetModuleFileNameEx(ProcessHandle, 0, ExePath,127);
     cb := SizeOf(_PROCESS_MEMORY_COUNTERS);
     GetMem(pmc, cb);
     pmc^.cb := cb;
     GetProcessMemoryInfo(ProcessHandle, pmc, cb) ;

     hIcon:= ExtractIcon(HInstance, ExePath,0);
     if hIcon = 0 then
       hIcon:= ExtractIcon(hInstance, PChar("C:\Program Files\ico.ico"), 0);
     ImageIndex:= ImageList_AddIcon(Form1.ImageList1.Handle, hIcon);
     Caption:= ExtractFileName(szExeFile);

     case pcPriClassBase of
         4: SubItems.Add(Format("%d (Idle)", [pcPriClassBase]));
         8: SubItems.Add(Format("%d (Norm)", [pcPriClassBase]));
        13: SubItems.Add(Format("%d (High)", [pcPriClassBase]));
        24: SubItems.Add(Format("%d (Real)", [pcPriClassBase]));
     else
      SubItems.Add(Format("%d", [pcPriClassBase]));
    end;
 
    SubItems.Add( IntToStr(pmc^.WorkingSetSize div 1024) + " KB");
     SubItems.Add(ExpandFileName( ExePath));
   end;
   FreeMem(pmc);
  inc(Count);
 end;

begin
hSnapShot:= CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hSnapShot<>INVALID_HANDLE_VALUE then
 begin
  Form1.ListView1.Items.Clear;
  lppe.dwSize:= SizeOf(lppe);
  Count:= 0;
  if Process32First(hSnapShot, lppe) then _FillList;
  while Process32Next(hSnapShot, lppe) do _FillList;

  CloseHandle(hSnapShot);
 end
  else
   MessageBox(Form1.Handle, "Internal error", "Error", MB_OK or MB_ICONERROR);
end;


 
begin...end ©   (2006-03-12 15:59) [7]

> Handle   (12.03.06 15:48) [6]

> В этом то у меня и проблемма я просто не знаю как это сделать?

GetProcessTimes помещает время создания в структуру FILETIME. Сравнить две такие структуры можно с помощью CompareFileTime.

> Загружаю в TListView список процессов, при появлении нового
> процесса

А появление нового процесса определяете по тому, что текущее количество процессов больше, чем предыдущее? Это неправильно. Допустим, один процесс завершился, и тут же запустился другой. Общее их количество не изменилось, однако новый процесс запущен. Да и если количество процессов уменьшилось -- разве это не нужно отобразить в списке?

> можно конечно просто обновить весь TListView

Вот я бы так и делал. И диспетчер задач, если не ошибаюсь, делает именно так. Хотя список процессов он получает, конечно, не через CreateToolhelp32Snapshot. Я бы отказался от использования этой функции (тем более, у Вас NT-система), поскольку она не всегда позволяет получить полный список процессов.


 
Handle   (2006-03-12 16:07) [8]

Спасибо.

Можно ещё вопросик насчёт

> Хотя список процессов он получает, конечно, не через CreateToolhelp32Snapshot.

А как ?


 
begin...end ©   (2006-03-12 16:14) [9]

> Handle   (12.03.06 16:07) [8]

Через NtQuerySystemInformation.


 
BiN ©   (2006-03-13 00:52) [10]


> begin...end ©   (12.03.06 15:59) [7]
>
> > Handle   (12.03.06 15:48) [6]
>
Я бы отказался от использования
> этой функции (тем более, у Вас NT-система), поскольку она
> не всегда позволяет получить полный список процессов.


Откуда дровишки?



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

Форум: "WinAPI";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.052 c
9-1130671062
Зм1й
2005-10-30 14:17
2006.06.04
Ошибка при проигрывании Avi


2-1147676291
Мурзилка
2006-05-15 10:58
2006.06.04
TTreeView


15-1147264331
kalisto
2006-05-10 16:32
2006.06.04
Delphi7


2-1148008142
not ZX
2006-05-19 07:09
2006.06.04
как получить картинку окна если оно невидно?


2-1147878626
Sapan
2006-05-17 19:10
2006.06.04
Создание процедуры в Delphi7





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский