Ejemplo de implementación de Delphi para obtener una lista de procesos e información relacionada
Prefacio:
No tengo nada que hacer. Es divertido mirar el administrador de tareas. Verifiqué la información y la implementé brevemente. No hay ningún código para obtener el uso de la CPU. Hay muchos códigos en línea. forma de escribir, así que no lo escribiré aquí. Continuaremos mejorándolo en el futuro, pero aún no se puede obtener la información sobre el proceso del sistema y el sistema. Si alguien lo sabe, puedo recordárselo.
El código es el siguiente.
unidad principal; la interfaz utiliza Windows, Mensajes, SysUtils, Variantes, Clases, Gráficos, Controles, Formularios, Diálogos, TlHelp32, StdCtrls, ComCtrls, psAPI tipo PTokenUser = ^TTokenUser = registrar Usuario: TSIDAndAttributes; TForm1= class(TForm) btn_Get: TButton; Lv_Process: TListView; procedimiento btn_GetClick(Remitente: TObject); procedimiento FormCreate(Remitente: TObject); función privada {Declaraciones privadas} GetMemUsedText(memsize:Cardinal):string; :cadena; función GetCupUsedPercent(hprocess:THandle):string; function GetProcessUser(hprocess:THandle):string; public { Declaraciones públicas } end; var Form1: TForm1; implementación {$R *.dfm} { Función: Elevar privilegios para depurar, para use Vista para leer la información del sistema en Win7, debe ejecutarlo como función de administrador} PromoteProcessPrivilege(Processhandle:Thandle;Token_Name:pchar):boolean; var Token:cardinal; TokenPri:_TOKEN_PRIVILEGES; Luid:int64; i:DWORD:=false; comenzar //Mire el valor de privilegio de los permisos del sistema si LookupPrivilegeValue(nil,Token_Name,Luid) luego comienza TokenPri.PrivilegeCount:=1; TokenPri.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED; Luid; i:=0; //Elevar derechos si AjustarTokenPrivileges(Token,false,TokenPri,sizeof(TokenPri),nil,i) luego Resultado:=true end; CloseHandle(Token End); : TSystemTime; comenzar FileTimeToSystemTime(KernelTime, SysTimeK); FileTimeToSystemTime(UserTime, SysTimeU); Resultado:=SystemTimeToDateTime(SysTimeK)+SystemTimeToDateTime(SysTimeU); fin; // Obtener la función de tiempo de CPU GetProcCPUTime(procID:THandle): TDateTime, ExitTime, KernelTime, UserTime: TFileTime; (procID, hora de creación, hora de salida, KernelTime,UserTime);= AddFileTimes(KernelTime, UserTime); fin; procedimiento TForm1.btn_GetClick(Remitente: TObject); var hSnapShot,hProcess,hModel:THandle; Información de la memoria pPMC:PPROCESS_MEMORY_COUNTERS; pPMCSize,ProcessPriority:Cardinal; n:DWORD; fName:array [0..MAX_PATH-1] of char; comenzar //Crear una instantánea del proceso hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); ; //El primer proceso encuentra := Process32First(hSnapShot,pEntry); mientras busca, comienza el elemento: = Lv_Process.Items.Add; // Nombre del proceso item.Caption : = pEntry.szExeFile; // ID del proceso item.SubItems.Add (IntToStr (pEntry.th32ProcessID)); ); GetMem(pPMC,pPMCTamaño); pPMCSize; //Abra el proceso y aumente el permiso PROCESS_VM_READ para que hProcess pueda usarse para obtener la ruta completa más tarde:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,pEntry.th32ProcessID //Obtener información de la memoria si GetProcessMemoryInfo(hProcess,pPMC); ,pPMCSize) luego comience //Obtener el usuario del proceso item.SubItems.Add(GetProcessUser(hProcess)); //Uso de memoria item.SubItems.Add(GetMemUsedText(pPMC.WorkingSetSize)); //Pico de memoria item.SubItems.Add(GetMemUsedText( pPMC.Tamaño del conjunto de trabajo máximo)); //Tiempo de CPU item.SubItems.Add(FormatDateTime('hh:mm:ss',GetProcCPUTime(hProcess))); //Obtener prioridad ProcessPriority := GetPriorityClass(hProcess); item.SubItems.Add(GetProcessPriority(ProcessPriority) ) ; //Encontrar el identificador del módulo según el identificador del proceso ENumProcessModules(hProcess,@hModel,SizeOf(hModel),n); //Obtener la ruta completa GetModuleFileNameEx(hProcess,hModel,fName,Length(fName)); Agregar(fName) ; fin; FreeMem(pPMC); CloseHandle(hProcess); Process32Next(hSnapShot,pEntry); fin; función TForm1.GetCupUsedPercent(hprocess: THandle): cadena; comenzar fin; K'; fin; función TForm1.GetProcessPriority(prioridad: Cardinal): cadena; inicio de prioridad de caso de IDLE_PRIORITY_CLASS: Resultado := 'bajo'; NORMAL_PRIORITY_CLASS: Resultado := 'normal'; tiempo'; fin; fin; //Obtener el usuario de la función de proceso TForm1.GetProcessUser(hprocess: THandle): string; var hToken:THandle; dwSize,dwUserSize,dwDomainSize:DWORD; pUser:PTokenUser, szDomainName: array of peUse: SID_NAME_USE; //Abrir permisos si no OpenProcessToken(hprocess,TOKEN_QUERY,hToken) luego Salir; //Obtener información del token, el tercer parámetro aquí usa nil, que primero devuelve el tamaño real dwSize y luego asigna memoria de acuerdo con este tamaño GetTokenInformation(hToken,TokenUser,nil,0, dwSize); pUser := nil; //Asignar espacio ReallocMem(pUser,dwSize); := 0; dwDomainSize := 0; //Obtener información si no es GetTokenInformation(hToken,TokenUser,pUser,dwSize,dwSize) y luego salir; // Para encontrar información del usuario, primero devuelva el nombre de usuario y el tamaño del nombre de dominio. Por supuesto, también puede obtenerlo todo a la vez, es decir, sin usar la matriz dinámica LookupAccountSid(nil,pUser.User.Sid,nil,dwUserSize. ,nil,dwDomainSize,peUse); si (dwUserSize <> 0) y (dwDomainSize <> 0) entonces comienzan //Asignar longitud SetLength(szUserName,dwUserSize); SetLength(szDomainName,dwDomainSize); //Nuevamente, obtenga el nombre de usuario y el nombre de dominioLookupAccountSid(nil,pUser.User.Sid,PChar(szUserName),dwUserSize,PChar(szDomainName), dwDomainSize, peUse); final; PChar(szUserName)+'/'+PChar(szDomainName); CloseHandle(hToken); FreeMem(pUser); procedimiento TForm1.FormCreate(Sender: TObject);
Ejecutar imagen
Si tiene alguna pregunta, deje un mensaje o vaya a la comunidad de este sitio para comunicarse y discutir. Gracias por leer. Espero que pueda ayudar a todos. ¡Gracias por su apoyo a este sitio!