![]() |
|
|
#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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось 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. |