Форум: "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.041 c