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;