![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
Atreides |
![]()
Сообщение
#1
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Как сделать, так что бы в ListBox можно было бы отразить процессы, происходящие в данный момент в системе и при выборе из списка специальной кнопкой их закрывать? Примерно догадываюсь, как это сделать, но как формализовать не додумаюсь? Знаю, что надо сделать снимок системы через SnapShot, подключить модуль Thelp32, а как дальше?
Сообщение отредактировано: Atreides - 1.03.2007 15:46 -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
DRKB3 -> Системные функции и WinAPI -> Windows -> Процессы, потоки, память, задачи -> Список задач, процессы и приоритеты -> Как получить список процессов?
и DRKB3 -> Системные функции и WinAPI -> Windows -> Запуск и завершение приложений -> Как завершить любой процесс, в том числе и системный |
Atreides |
![]()
Сообщение
#3
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
У меня только версия 2.3 и там есть пример просмотра и завершения процессов, но, к сожалению, только для винды 98, а, начиная с NT уже не работает. Пока нет времени, что бы скачать новую версию. Мне осталась только третья часть задания:
1. Создать список процессов. Кроме имен процессов, сохраняемых в массиве Pr_Names, необходимо сохранять в дополнительном массиве идентификаторы процессов. 2. Получить номер (индекс) выделенного мышью имени завершаемого процесса, используя метод ListBox1.ItemIndex и соответствующий ему идентификатор процесса. 3. По идентификатору процесса получить его описатель, используя функцию OpenProcess(). 4. Если описатель получен, завершить процесс, используя полученный описатель. Я написал получение списка процессов, идентификаторов процессов и базовых приоритетов потоков осталось только сделать кнопку (Button2) завершения выбранного процесса из списка, а вот как это сделать? К тому же нужно сделать, так что бы кнопка делалась активной только когда выбирается процесс из списка ListBox, это как можно сделать? Для завершения процесса используется функция TerminateProcess ( HandleProc, ExitCode). Значение описателя необходимо получить по идентификатору процесса с помощью функции OpenProcess ( PROCESS_TERMINATE)? Код unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, tlhelp32, StdCtrls, Buttons, ComCtrls, Menus; type TForm1 = class(TForm) ListBox1: TListBox; Label1: TLabel; Button1: TButton; Button2: TButton; Label2: TLabel; ListView1: TListView; Button3: TButton; BitBtn1: TBitBtn; MainMenu1: TMainMenu; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; procedure Button1Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure N3Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var SH : Thandle; Num, I : Integer; PPE : TProcessEntry32; Pr_names : array [0..50] of string; begin Num := 0; // получение снимка состояния системы SH := CreateToolHelp32SnapShot(Th32cs_SnapAll, 0); // выделение из снимка имени первого процессов PPE.dwSize := sizeof (ProcessEntry32); Process32First(SH, PPE); Pr_Names [Num] := PPE.szExeFile; // получение имен других процессов while Process32Next(SH, PPE) do begin Num := Num + 1; Pr_Names [Num] := PPE.szExeFile; end; Listbox1.Clear; // вывод списка имен выполняющихся процессов for I := 0 to Num do Listbox1.Items.Add (Pr_Names [I] ); // освобождение ресурса - снимка состояния системы CloseHandle(SH) end; procedure TForm1.BitBtn1Click(Sender: TObject); begin Close; end; procedure TForm1.N3Click(Sender: TObject); begin Close; end; procedure TForm1.Button3Click(Sender: TObject); var Sh : Thandle; Th : TTHREADENTRY32; LstIt : TlistItem; begin Sh := CreateToolHelp32Snapshot (TH32CS_SNAPALL,0); Th.dwSize := sizeof (TTHREADEntry32); Thread32First(sh,Th); ListView1.Items.Clear; LstIt :=ListView1.Items.Add; LstIt.Caption:=IntToStr(Th.th32OwnerProcessID); LstIt.SubItems.Add(IntToStr(Th.tpBasePri)); repeat LstIt :=ListView1.Items.Add; LstIt.Caption:=IntToStr(Th.th32OwnerProcessID); LstIt.SubItems.Add(IntToStr(Th.tpBasePri)) until not Thread32Next (sh,Th); CloseHandle(Sh); end; end. Сообщение отредактировано: Atreides - 2.03.2007 17:06 -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
// Функция завершения процесса - проверено под XPВсе рабочее, проверено только что на D6 + WinXP |
Atreides |
![]()
Сообщение
#5
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Зачем править эту строку:
Pr_Names [Num] := '(' + inttostr(ppe.th32ProcessID) + ') ' + PPE.szExeFile; А комментарии к function ProcessTerminate можно расписать? P.S. Извиняюсь, скрипт [code] в этом инет-клубе не работает. Сообщение отредактировано: Atreides - 3.03.2007 9:33 -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
ProcessTreminate взята из DRKB 2.3 - там есть комментарии (я удалил потому, что у меня Delphi не поддерживает кириллицу...)
Цитата Зачем править эту строку: Затем, чтобы тебе не пришлось после того, как ты вызвал "Удалить процесс" еще раз проходить по всему списку процессов с помощью CreateToolHelp32SnapShot (двойная работа!!!) и искать ProcessID по известному имени... После исправления, которое я сделал, ProcessID хранится рядом с именем процесса в ListBox-е, и его надо только вытащить оттуда, что и делается в Button2.OnClick. |
Atreides |
![]()
Сообщение
#7
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
А как сделать, что бы после нажатия кнопки завершения процесса содержание ListBox1 обновлялось? Я пробовал дописать ListBox1.Refresh, но список не обновляется.
-------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
-Volvo- |
![]()
Сообщение
#8
|
Гость ![]() |
Добавь вызов Button1Click, чтобы заново сгенерировать список процессов.
|
Atreides |
![]()
Сообщение
#9
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Как реализовать, чтобы для выбранного процесса из списка ListBox’a вывести сведения о его приоритете, количестве потоков и об используемых им кучах, используя компонент StringGrid? Процесс выбирать с помощью мыши в списке из окна Listbox’а.
Цитата Добавь вызов Button1Click, чтобы заново сгенерировать список процессов. В смысле код из под Button1Click добавить к кнопке завершения процесса или как? Сообщение отредактировано: Atreides - 11.03.2007 16:44 -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
Atreides |
![]()
Сообщение
#10
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
При помощи средств Delphi можно узнать, сколько времени процесс провел в режиме ядра и ЦП?
-------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
Atreides |
![]()
Сообщение
#11
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Вот нашел тут одну ссылку, но она на C, а как перегнать на Delphi?
Цитата Мониторинг выполняющихся в системе процессов – основа всех приложений для наблюдения за работой информационных систем и их пользователей. Для отслеживания появления в системе новых приложений или завершения выполнявшихся можно использовать два способа: 1. периодическое выполнение снимка состояния системы и его анализ, для чего приложение, рассмотренное в п.1.1.1, подключается к обработчику прерываний таймера. Это просто, но неэффективно – приложения не запускаются и не завершаются то и дело. 2. подключение к процедуре запуска и завершения процессов с помощью функции ядра PsSetCreateProcessNotifyRoutine(), описанной в Windows 2000 DDK, путем регистрации функции обратного вызова. Это не так просто, как хотелось бы, но более эффективно. 1.4 Функция NtQuerySystemInformation Различная системная информация доступна через функцию NtQuerySystemInformation. Описание приведено в стиле С для интересующихся. NTSTATUS NtQuerySystemInformation(SystemInformationClass указывает тип информации, которую необходимо получить, SystemInformation - это указатель на результирующий буфер, SystemInformationLength - размер этого буфера, ReturnLength – количество записанных байт. Для перечисления запущенных процессов следует установить в параметр SystemInformationClass значение SystemProcessesAndThreadsInformation. #define SystemInformationClass 5 Возвращаемая структура в буфере SystemInformation: typedef struct _SYSTEM_PROCESSES { -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
А что, собственно, там перегонять? Описания структур? В DRKB приведено несколько примеров работы с NtQuerySystemInformation, посмотри как это делается ...
|
Atreides |
![]()
Сообщение
#13
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
С помощью NtQuerySystemInformation, можно получить вот эти сведения о приоритете и количестве потоков, об используемых кучах процессом? Я пример скачать не могу, может ссылка битая?
Сообщение отредактировано: Atreides - 14.03.2007 13:14 -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Посмотри вот эту тему, там Rouse_ выкладывал неплохой пример:
Sources.RU -> Пишем Диспетчер задач на Delphi |
Iren |
![]()
Сообщение
#15
|
Гость ![]() |
У меня подобное задание: нужно разработать приложение для вывода всех процессов в отдельном ListBox, получения их модулей и вывода в StringGrid, при выборе процесса из ListBox1, сведений о времени старта процесса, времени работы в режиме ядра и режиме пользователя. С выводом процессов и модулей я справилась, осталось вывести сведения о времени старта процесса, времени работы в режиме ядра и режиме пользователя в StringGrid.
unit Unit1;Помогите пожалуйста разобраться. |
Atreides |
![]()
Сообщение
#16
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
А как сделать, что бы можно было выбрать процесс из списка, а в StringGrid выводились сведения о начале его работы, завершения и приоритет?
-------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
Atreides |
![]()
Сообщение
#17
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Написал передачу параметров процессов в StringGrid? А как определить время работы процесса в режиме пользователя (UserTime) и ядра (KernelTime), а так же его время старта?
unit pro; -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
Atreides |
![]()
Сообщение
#18
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Доделал я это задание (получить список выполняющихся процессов в системе, вывести модули выбранного процесса и его потоки, идентификатор, время старта, работы в режиме ядра и пользователя), если кому интересно, то вот код:
unit Unit1; -------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
Atreides |
![]()
Сообщение
#19
|
![]() Ветеран Броуновского Движения ![]() ![]() ![]() Группа: Пользователи Сообщений: 281 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Может, кто знает, как получить имя файла и его версию по имени созданного им процесса? То есть: есть список процессов (см. выше) и по клику на имени процесса выводить имя файла создавшего его и его версию?
-------------------- Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
|
![]() ![]() |
![]() |
Текстовая версия | 26.07.2025 6:29 |