procedure GetCurrentApps;
{
返回当前运行的进程的可执行文件名称列表
}
var
ContinueLoop: BOOL;
SnapshotHandle: THandle;
ProcessEntry32: TProcessEntry32;
hProcess: THandle;
Buffer: array [0 .. MAX_PATH] of char;
L: integer;
FItem: TProcessInfo;
SessionID: DWORD;
wtsPInfo: PWTS_PROCESS_INFO;
wtsPCount: Cardinal;
Ptr: Pointer;
function GetSID(PID: THandle): PSID;
var
i: integer;
P: PWTS_PROCESS_INFO;
begin
Result := nil;
P := wtsPInfo;
for i := 0 to Pred(wtsPCount) do
begin
if P.ProcessId = PID then
begin
Result := P.pUserSid;
Break;
end;
Inc(P);
end;
end;
function GetWTSString(wtsInfo: _WTS_INFO_CLASS): string;
var
R: DWORD;
// Ptr : Pointer;
begin
// Ptr := nil;
if WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, SessionID, wtsInfo,
Ptr, R) and (R > 1) then
Result := PChar(Ptr)
else
Result := (' <Unknown> ');
// WTSFreeMemory(Ptr);
end;
begin
SnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
ProcessEntry32.dwSize := Sizeof(ProcessEntry32);
ContinueLoop := Process32First(SnapshotHandle, ProcessEntry32);
FProcessList.Clear;
WTSEnumerateProcesses(WTS_CURRENT_SERVER, 0, 1, wtsPInfo, wtsPCount);
ListView1.Items.BeginUpdate;
ListView1.Clear;
while ContinueLoop do
with ListView1.Items.Add do
begin
FItem := TProcessInfo.Create;
FProcessList.Add(FItem);
FItem.ProcessInfo := ProcessEntry32;
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False, ProcessEntry32.th32ProcessID);
GetProcessMemoryInfo(hProcess, @FItem.MemInfo, Sizeof(FItem.MemInfo));
GetProcessTimes(hProcess, FItem.CreateTime, FItem.ExitTime,FItem.KernelTime, FItem.UserTime);
FItem.PriorityClass := GetPriorityClass(hProcess);
FItem.GUIGDIObjects := GetGuiResources(hProcess, GR_GDIOBJECTS);
FItem.GUIUserObjects := GetGuiResources(hProcess, GR_USEROBJECTS);
FItem.Version := GetProcessVersion(hProcess);
FillChar(Buffer, Sizeof(Buffer), 0);
L := GetModuleFileNameEx(hProcess, 0, Buffer, Sizeof(Buffer));
FItem.FileName := StrPas(Buffer);
Caption := ProcessEntry32.szExeFile;
Data := FItem;
SubItems.Add(IntToStr(ProcessEntry32.th32ProcessID));
FItem.Account := GetUserNameFromSID(GetSID(ProcessEntry32.th32ProcessID));
SubItems.Add(FItem.Account);
ProcessIdToSessionId(ProcessEntry32.th32ProcessID, SessionID);
FItem.SessionID := IntToStr(SessionID);
Ptr := nil;
FItem.UserName := GetWTSString(WTSUserName);
WTSFreeMemory(Ptr);
SubItems.Add(FItem.UserName);
Ptr := nil;
FItem.DomainName := GetWTSString(WTSDomainName);
WTSFreeMemory(Ptr);
Ptr := nil;
FItem.Station := GetWTSString(WTSWinStationName);
WTSFreeMemory(Ptr);
SubItems.Add(FItem.Station);
Ptr := nil;
FItem.InitProgram := GetWTSString(WTSInitialProgram);
WTSFreeMemory(Ptr);
Ptr := nil;
FItem.ClientName := GetWTSString(WTSClientName);
WTSFreeMemory(Ptr);
Ptr := nil;
FItem.AppName := GetWTSString(WTSApplicationName);
WTSFreeMemory(Ptr);
Ptr := nil;
FItem.WorkDir := GetWTSString(WTSWorkingDirectory);
WTSFreeMemory(Ptr);
SubItems.Add(IntToStr(ProcessEntry32.cntThreads));
if L > 0 then
begin
L := Pos(':\ ', FItem.FileName);
if L > 2 then
System.Delete(FItem.FileName, 1, L - 2);
SubItems.Add(FItem.FileName);
ImageIndex := GetIconIndex(FItem.FileName, FILE_ATTRIBUTE_NORMAL);
end
else
begin
FItem.FileName := ProcessEntry32.szExeFile;
SubItems.Add(ProcessEntry32.szExeFile);
ImageIndex := GetIconIndex(ProcessEntry32.szExeFile,
FILE_ATTRIBUTE_NORMAL);
end;
ImageList1.GetIcon(ImageIndex, FItem.Icon);
ContinueLoop := Process32Next(SnapshotHandle, ProcessEntry32);
CloseHandle(hProcess);
end;
ListView1.Items.EndUpdate;
ListView1SelectItem(ListView1, ListView1.Items[0], False);
// WTSFreeMemory(Ptr);
WTSFreeMemory(wtsPInfo);
CloseHandle(SnapshotHandle);
end;遍历进程
最新推荐文章于 2018-11-11 03:36:11 发布
该过程遍历系统中的所有进程,收集如进程名、PID、内存使用、优先级等信息,并显示在ListView中。通过OpenProcess获取进程详细信息,使用WTS API获取会话ID、用户名等相关数据。
935

被折叠的 条评论
为什么被折叠?



