![]() |
|
|
|
|
#1
|
|||
|
|||
|
привет всем. как можно получить список запущеных процессов (а не окон) и делать различные операции(приоритет, завершение, проверка пользователя и занятой ОП)?... прийму любые ссылки на статьи спасибо заранее за помощь) у меня есть исходник диспетчера задач. хорошая штука но все равно не могу с него ничего слить))) в коде путаюсь... помогите написать программу типа - кнопка и мемо. нажимаю на кнопку и в мемо список текущих процессов... все заранее спасибо!
|
|
#2
|
||||
|
||||
|
Подойдёт?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
Wnd: hWnd;
buff: array[0..127] of Char;
begin
ListBox1.Clear;
Wnd := GetWindow(Handle, GW_HWNDFIRST);
while Wnd <> 0 do
begin
if (Wnd <> Application.Handle) and IsWindowVisible(Wnd) and (GetWindow(Wnd, GW_OWNER) = 0) and (GetWindowText(Wnd, buff, SizeOf(buff)) <> 0) then
begin
GetWindowText(Wnd, buff, SizeOf(buff));
ListBox1.Items.Add(StrPas(buff));
end;
Wnd := GetWindow(Wnd, GW_HWNDNEXT);
end;
ListBox1.ItemIndex := 0;
end;Код:
procedure GetProcessList(var sl: TStrings);
var
pe : TProcessEntry32;
ph, snap : THandle; //дескрипторы процесса и снимка
mh : hmodule; //дескриптор модуля
procs : array[0..$FFF] of dword; //массив для хранения дескрипторов процессов
count, cm : cardinal; //количество процессов
I : Integer;
ModName: array[0..max_path] of char; //имя модуля
begin
sl.Clear;
if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then
begin //если это Win9x
snap := CreateToolhelp32Snapshot(th32cs_snapprocess, 0);
if integer(snap) = -1 then
begin
exit;
end
else
begin
pe.dwSize := sizeof(pe);
if Process32First(snap, pe) then
repeat
sl.Add(string(pe.szExeFile));
until not Process32Next(snap, pe);
end;
end
else
begin //Если WinNT/2000/XP
if not EnumProcesses(@procs, sizeof(procs), count) then
Exit;
for I := 0 to count div 4 - 1 do
begin
ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
False, procs[i]);
if ph > 0 then
begin
EnumProcessModules(ph, @mh, 4, cm);
GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));
sl.Add(string(ModName));
CloseHandle(ph);
end;
end;
end;
end;
Пример использования:
procedure TForm1.Button1Click(Sender: TObject);
var
tmp: TStrings;
begin
tmp := memo1.Lines;
GetProcessList(tmp);
end;Последний раз редактировалось angvelem, 23.01.2012 в 01:49. |
|
#3
|
|||
|
|||
|
спасибо большое, сейчас проверю)
|
|
#4
|
|||
|
|||
|
хм неизвестный индетификатор EnumProcesses(@procs, sizeof(procs), count)
|
|
#5
|
|||
|
|||
|
спасибо) разобрался) 2 код хорош)
|
|
#6
|
|||
|
|||
|
Код:
function AdjustCurrentProcessPrivileges(PrivilegeName: WideString): Boolean;
var
TokenHandle: THandle;
TokenPrivileges: TTokenPrivileges;
ReturnLength: DWORD;
begin
Result := False;
try
if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle) then
begin
try
LookupPrivilegeValueW(nil, PWideChar(PrivilegeName), TokenPrivileges.Privileges[0].Luid);
TokenPrivileges.PrivilegeCount := 1;
TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(TokenHandle, False, TokenPrivileges, 0, nil, ReturnLength) then
Result := True;
finally
CloseHandle(TokenHandle);
end;
end;
except
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//Получаем привилегии отладчика что бы можно было открывать и завершать системные процессы
AdjustCurrentProcessPrivileges('SeDebugPrivilege');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ProcessHandle: THandle;
begin
ProcessHandle:= OpenProcess(PROCESS_TERMINATE, True, StrToInt(Edit1.Text));
if ProcessHandle <> 0 then
begin
try
if not TerminateProcess(ProcessHandle, 0) then
ShowMessage('Невозмжно завершить процесс (' + Edit1.Text + ')');
finally
CloseHandle(ProcessHandle);
end;
end
else
begin
ShowMessage('Невозмжно открыть процесс (' + Edit1.Text + ')');
end;
end; |
|
#7
|
|||
|
|||
|
Цитата:
Подключить еще нужно в uses Psapi и tlhelp32 Последний раз редактировалось Helpix, 28.06.2012 в 14:51. |