遍历进程

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;

你可能感兴趣的:(ListView,server,function,Integer,buffer,imagelist)