Visor de proceso componente
Un Componente que muestra todos los procesos en ejecución, no sólo en WinNT pero también
en windows 98/95 !
Un Componente que muestra todos los procesos en ejecución, no sólo en WinNT pero
también en windows 98/95 !
también tiene un método público calld KillSelectedProcess, supongo que usted
puede averiguar lo que hace...
me ha ahorrado un montón de problemas y me salvó un montón de necesidades
reiniciar el sistema en mi windows98 máquina...
bueno, aquí está la fuente :
Lo que tenemos que hacer es hacer una nueva unidad, copia este texto en
y guardar la unidad como ggProcessViewer.
a Continuación, usted puede instalar en su componente de palets mediante el uso de la
delphi menú principal, Componente/Install Component...
Tienen un montón de diversión...
unidad de ggProcessViewer
interfaz
usos
& nbsp & nbsp Windows, SysUtils, Classes, los Controles, las redes, ExtCtrls, mensajes,
& nbsp & nbsp tlHelp32, Cuadros de diálogo
tipo
//NT Funciones para la obtención de la información de proceso :
& nbsp & nbsp TEnumProcesses = function(lpidProcess: LPDWORD cb: DWORD
& nbsp & nbsp & nbsp & nbsp var cbNeeded: DWORD): BOOL StdCall //externo cPSAPIDLL
& nbsp & nbsp TGetModuleBaseNameA = function(hProcess: THandle hModule: HMODULE
& nbsp & nbsp & nbsp & nbsp lpBaseName: PAnsiChar nSize: DWORD): DWORD StdCall //externo cPSAPIDLL
& nbsp & nbsp TGetModuleFileNameExA = function(hProcess: THandle hModule: HMODULE
& nbsp & nbsp & nbsp & nbsp lpFilename: PAnsiChar nSize: DWORD): DWORD StdCall //externo cPSAPIDLL
& nbsp & nbsp TEnumProcessModules = function (hProcess: THandle lphModule: LPDWORD
& nbsp & nbsp & nbsp & nbsp cb: DWORD var lpcbNeeded: DWORD): BOOL StdCall //externo cPSAPIDLL
& nbsp & nbsp TPByte = ^TByte
& nbsp & nbsp TByte = array[0..0] de bytes
& nbsp & nbsp ThackWinControl = clase(TWinControl)
& nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp propiedad de Texto
& nbsp & nbsp final
& nbsp & nbsp ThackGraphicControl = clase(TGraphicControl)
& nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp propiedad Caption
& nbsp & nbsp final
& nbsp & nbsp TProcessTimeType = (ptCreationTime, ptExitTime, ptKernelTime,
& nbsp & nbsp & nbsp & nbsp ptUserTime, ptCPUTime)
& nbsp & nbsp TAfterRefreshProcesses = procedimiento(Sender: TObject) del objeto
& nbsp & nbsp TBeforeRefreshProcesses = procedimiento(Sender: TObject) del objeto
& nbsp & nbsp TggProcessViewer = clase(TStringGrid)
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp FProcessCount : integer
& nbsp & nbsp & nbsp & nbsp FAutoRefresh : boolean
& nbsp & nbsp & nbsp & nbsp FAfterRefreshProcesses : TAfterRefreshProcesses
& nbsp & nbsp & nbsp & nbsp FBeforeRefreshProcesses : TBeforeRefreshProcesses
& nbsp & nbsp & nbsp & nbsp RefreshTimer : TTimer
& nbsp & nbsp & nbsp & nbsp procedimiento InitGridForNT
& nbsp & nbsp & nbsp & nbsp procedimiento Getprocesses
& nbsp & nbsp & nbsp & nbsp procedimiento GetProcessesOnNT
& nbsp & nbsp & nbsp & nbsp función SetProcessCount: integer
& nbsp & nbsp & nbsp & nbsp procedimiento GetProcessCount(const Valor: integer)
& nbsp & nbsp & nbsp & nbsp procedimiento GetTheProcessTimes(PID: integer)
& nbsp & nbsp & nbsp & nbsp procedimiento SetAutoRefresh(const Value: boolean)
& nbsp & nbsp & nbsp & nbsp procedimiento TimerAutoRefresh(Sender: TObject)
& nbsp & nbsp & nbsp & nbsp procedimiento InitGridForWinXX
& nbsp & nbsp & nbsp & nbsp procedimiento GetProcessesOnWinXX
& nbsp & nbsp protegido
& nbsp & nbsp & nbsp & nbsp //Adress los titulares de los procedimientos para el NT
& nbsp & nbsp & nbsp & nbsp EnumProcesses : TEnumProcesses
& nbsp & nbsp & nbsp & nbsp GetModuleBaseNameA : TGetModuleBaseNameA
& nbsp & nbsp & nbsp & nbsp GetModuleFileNameExA : TGetModuleFileNameExA
& nbsp & nbsp & nbsp & nbsp EnumProcessModules : TEnumProcessModules
& nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp constructor Create(AOwner: TComponent) reemplazar
& nbsp & nbsp & nbsp & nbsp destructor Destruir reemplazar
& nbsp & nbsp & nbsp & nbsp procedimiento de Actualización
& nbsp & nbsp & nbsp & nbsp procedimiento KillSelectedProcess
& nbsp & nbsp publicado
& nbsp & nbsp & nbsp & nbsp propiedad DoubleBuffered
& nbsp & nbsp & nbsp & nbsp propiedad ProcessCount: Entero leer SetProcessCount escribir GetProcessCount
& nbsp & nbsp & nbsp & nbsp propiedad Autorefresco: Boolean leer FAutoRefresh escribir SetAutoRefresh
& nbsp & nbsp & nbsp & nbsp propiedad AfterRefreshProcesses: TAfterRefreshProcesses
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp leer FAfterRefreshProcesses escribir FAfterRefreshProcesses
& nbsp & nbsp & nbsp & nbsp propiedad BeforeRefreshProcesses: TBeforeRefreshProcesses
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp leer FBeforeRefreshProcesses escribir FBeforeRefreshProcesses
& nbsp & nbsp final
procedimiento de Registro
const
& nbsp & nbsp cPSAPIDLL = 'PSAPI.dll'
& nbsp & nbsp ProcessBasicInformation = 0
aplicación
procedimiento de Registro
begin
& nbsp & nbsp RegisterComponents('GuidoG', [TggProcessViewer])
fin
{ TggProcessViewer }
constructor TggProcessViewer.Create(AOwner: TComponent)
begin
& nbsp & nbsp heredado
& nbsp & nbsp RefreshTimer := TTimer.Create(Self)
& nbsp & nbsp RefreshTimer.OnTimer := TimerAutoRefresh
& nbsp & nbsp FixedCols := 0
& nbsp & nbsp DefaultRowHeight := 15
& nbsp & nbsp ColWidths[0] := 120
& nbsp & nbsp ColWidths[1] := 60
& nbsp & nbsp ColWidths[2] := 50
& nbsp & nbsp ColWidths[3] := 360
& nbsp & nbsp Opciones := Opciones - [goVertLine, goHorzLine]
& nbsp & nbsp & nbsp & nbsp [goDrawFocusSelected, goThumbTracking, goColSizing, goRowSizing]
& nbsp & nbsp GetProcesses
& nbsp & nbsp FAutoRefresh := TRUE
fin
procedimiento TggProcessViewer.InitGridForNT
begin
& nbsp & nbsp ColCount := 7
& nbsp & nbsp RowCount := 2
& nbsp & nbsp Células[0, 0] := 'Proceso'
& nbsp & nbsp Células[1, 0] := 'PID'
& nbsp & nbsp Células[2, 0] := 'tiempo de CPU'
& nbsp & nbsp Células[3, 0] := 'Kernel de tiempo'
& nbsp & nbsp Células[4, 0] := 'tiempo de Usuario'
& nbsp & nbsp Células[5, 0] := 'Prioridad'
& nbsp & nbsp Células[6, 0] := 'Ubicación'
& nbsp & nbsp Células[0, 1] := '
& nbsp & nbsp Células[1, 1] := '
& nbsp & nbsp Células[2, 1] := '
& nbsp & nbsp Células[3, 1] := '
& nbsp & nbsp Células[4, 1] := '
& nbsp & nbsp Células[5, 1] := '
& nbsp & nbsp Células[6, 1] := '
fin
procedimiento TggProcessViewer.InitGridForWinXX
begin
& nbsp & nbsp ColCount := 4
& nbsp & nbsp RowCount := 2
& nbsp & nbsp Células[0, 0] := 'Proceso'
& nbsp & nbsp Células[1, 0] := 'PID'
& nbsp & nbsp Células[2, 0] := 'Prioridad'
& nbsp & nbsp Células[3, 0] := 'Ubicación'
& nbsp & nbsp Células[0, 1] := '
& nbsp & nbsp Células[1, 1] := '
& nbsp & nbsp Células[2, 1] := '
& nbsp & nbsp Células[3, 1] := '
fin
procedimiento TggProcessViewer.GetProcessesOnNT
var
& nbsp & nbsp I : Integer
& nbsp & nbsp pidNeeded : DWORD
& nbsp & nbsp PIDList : array[0..1000] of Integer
& nbsp & nbsp PIDName : array [0..MAX_PATH - 1] of char
& nbsp & nbsp PH : THandle
& nbsp & nbsp hMod : HMODULE
& nbsp & nbsp dwSize2 : DWORD
& nbsp & nbsp J,
& nbsp & nbsp ColBeforeRefresh : integer
& nbsp & nbsp PIDContentsBeforeRefresh : string
begin
& nbsp & nbsp ColBeforeRefresh := Col
& nbsp & nbsp PIDContentsBeforeRefresh := Células[1, Fila]
& nbsp & nbsp Realizar(WM_SETREDRAW, 0, 0)
& nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp InitGridForNT
& nbsp & nbsp & nbsp & nbsp si no EnumProcesses(@PIDList, 1000, pidNeeded), a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp elevar la Excepción.Create('PSAPI.DLL no se ha encontrado! Está usted seguro de que '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'está ejecutando windows NT/Y2K ?')
& nbsp & nbsp & nbsp & nbsp for i := 0 a (pidNeeded div SizeOf (Entero)- 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & bsp & nbsp & nbsp & nbsp & nbsp PH := OpenProcess(PROCESS_QUERY_INFORMATION o PROCESS_VM_READ,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FALSO, PIDList[I])
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si el PH <> 0 then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si GetModuleFileNameExA(PH, 0, PIDName, SizeOf(PIDName)) > 0, entonces
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si EnumProcessModules(PH, @hMod, SizeOf(hMod), dwSize2) a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetModuleFileNameExA(PH, hMod, PIDName, SizeOf(PIDName))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Células[0, número de filas - 1] := ExtractFileName(PIDName)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Células[1, número de filas - 1] := IntToStr(PIDList[I])
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetTheProcessTimes(PIDList[I])
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp caso GetPriorityClass(PH) de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp HIGH_PRIORITY_CLASS: las Células[5, número de filas - 1] := 'Alto'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp IDLE_PRIORITY_CLASS: las Células[5, número de filas - 1] := 'Inactivo'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp NORMAL_PRIORITY_CLASS: las Células[5, número de filas - 1] := 'Normal'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp REALTIME_PRIORITY_CLASS : las Células[5, número de filas - 1] := 'Tiempo real'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Células[6, Número de filas - 1] := ExtractFilePath(PIDName)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp RowCount := Número de filas 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp CloseHandle(PH)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp si RowCount > 2 y
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp RowCount := número de filas - 1
& nbsp & nbsp & nbsp & nbsp FProcessCount := número de filas - 1
& nbsp & nbsp & nbsp & nbsp para J := 1 hasta número de filas - 1 hacer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si las Células[1, J] = PIDContentsBeforeRefresh, a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Col := ColBeforeRefresh
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Fila := J
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Break
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp Realizar(WM_SETREDRAW, 1, 0)
& nbsp & nbsp & nbsp & nbsp Invalidar
& nbsp & nbsp final
fin
procedimiento TggProcessViewer.GetTheProcessTimes(PID: integer)
var
& nbsp & nbsp lpLocalFileTime : TFileTime
& nbsp & nbsp lpSystemTime : TSystemTime
& nbsp & nbsp PH : THandle
& nbsp & nbsp hProcess : THandle
& nbsp & nbsp lpCreationTime,
& nbsp & nbsp lpExitTime,
& nbsp & nbsp lpKernelTime,
& nbsp & nbsp lpUserTime : TFileTime
& nbsp & nbsp KernelDay,
& nbsp & nbsp UserDay : integer
& nbsp & nbsp KernelTime,
& nbsp & nbsp UserTime : TDateTime
& nbsp & nbsp Resultado,
& nbsp & nbsp strHours : string
begin
& nbsp & nbsp Resultado := 'n/a'
& nbsp & nbsp hProcess := PID
& nbsp & nbsp PH := OpenProcess(PROCESS_QUERY_INFORMATION, FALSO, hProcess)
& nbsp & nbsp si el PH <> 0 then
& nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetProcessTimes(PH, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FileTimeToLocalFileTime(lpCreationTime, lpLocalFileTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp //Obtener el kernel de tiempo y formato
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FileTimeToSystemTime(lpKernelTime, lpSystemTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp KernelDay := lpSystemTime.wDay
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp KernelTime := SystemTimeToDateTime(lpSystemTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := TimeToStr(KernelTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp strHours := Copy(Resultado, 1, Pos(':', Resultado) - 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Eliminar(Resultado, 1, Pos(':', Resultado) - 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Células[3, número de filas - 1] := IntToStr(((KernelDay - 1) * 24)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp StrToInt(strHours)) El resultado es
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp //Obtener el tiempo de los usuarios y el formato
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FileTimeToSystemTime(lpUserTime, lpSystemTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp UserDay := lpSystemTime.wDay
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp UserTime := SystemTimeToDateTime(lpSystemTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := TimeToStr(UserTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp strHours := Copy(Resultado, 1, Pos(':', Resultado) - 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Eliminar(Resultado, 1, Pos(':', Resultado) - 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Células[4, número de filas - 1] := IntToStr(((UserDay - 1) * 24)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp - nbsp & nbsp StrToInt(strHours)) Resultado //TimeToStr(UserTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp //Calcular el tiempo de cpu y el formato
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := TimeToStr(UserTime KernelTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp strHours := Copy(Resultado, 1, Pos(':', Resultado) - 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Eliminar(Resultado, 1, Pos(':', Resultado) - 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Células[2, número de filas - 1] := IntToStr(((UserDay - KernelDay) * 24)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp StrToInt(strHours)) El resultado es
& nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp CloseHandle(PH)
& nbsp & nbsp & nbsp & nbsp final
fin
procedimiento TggProcessViewer.KillSelectedProcess
var
& nbsp & nbsp PH : THandle
& nbsp & nbsp lpExitCode : DWord
& nbsp & nbsp hProcess : el Cardenal
begin
& nbsp & nbsp hProcess := StrToInt64(Células[1, Fila])
& nbsp & nbsp PH := OpenProcess(PROCESS_TERMINATE o PROCESS_QUERY_INFORMATION,
& nbsp & nbsp & nbsp & nbsp FALSO, hProcess)
& nbsp & nbsp si el PH <> 0 then
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si GetExitCodeProcess(PH, lpExitCode) a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si MessageBox(Mango, PChar('lo que realmente quieres de mí para intentar'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'matar a este proceso ?'), 'Por favor, Confirmar',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MB_YESNO) = mrYES, a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp TerminateProcess(PH, lpExitCode)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MessageBox(Mango, PChar('debe estar muerto ahora...'),
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PChar('Check it out...'), MB_OK)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MessageBox(Mango, PChar('no se Pudo recuperar la ExitCode'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'para este proceso'. #13 #13
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SysErrorMessage(GetLastError)),
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PChar('Algo salió mal...'), MB_OK)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp CloseHandle(PH)
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp MessageBox(Mango, PChar('no se Pudo obtener acceso a este proceso'.
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp #13 #13 SysErrorMessage(GetLastError)),
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PChar('Algo salió mal...'), MB_OK) Actualizar
fin
procedimiento TggProcessViewer.Actualización
begin
& nbsp & nbsp si se ha asignado(FBeforeRefreshProcesses) y no
& nbsp & nbsp & nbsp & nbsp (csLoading en ComponentState), a continuación,
& nbsp & nbsp & nbsp & nbsp FBeforeRefreshProcesses(Auto)
& nbsp & nbsp GetProcesses
& nbsp & nbsp si se ha asignado(FAfterRefreshProcesses) y no
& nbsp & nbsp & nbsp & nbsp (csLoading en ComponentState) a continuación,
& nbsp & nbsp & nbsp & nbsp FAfterRefreshProcesses(Auto)
fin
función TggProcessViewer.SetProcessCount: integer
begin
& nbsp & nbsp Resultado := FProcessCount
fin
procedimiento TggProcessViewer.GetProcessCount(const Valor: integer)
begin
& nbsp & nbsp FProcessCount := número de filas - 1
fin
procedimiento TggProcessViewer.SetAutoRefresh(const Value: boolean)
begin
& nbsp & nbsp FAutoRefresh := Valor
& nbsp & nbsp RefreshTimer.Enabled := FAutoRefresh
fin
destructor TggProcessViewer.Destruir
begin
& nbsp & nbsp FreeAndNil(RefreshTimer)
& nbsp & nbsp heredado
fin
procedimiento TggProcessViewer.TimerAutoRefresh(Sender: TObject)
begin
& nbsp & nbsp RefreshTimer.OnTimer := NIL
& nbsp & nbsp Actualizar
& nbsp & nbsp RefreshTimer.OnTimer := TimerAutoRefresh
fin
procedimiento TggProcessViewer.GetProcessesOnWinXX
var
& nbsp & nbsp aHandle : THandle
& nbsp & nbsp FoundOne : bool
& nbsp & nbsp ProcessEntry32 : TProcessEntry32
& nbsp & nbsp ExeFile : string
& nbsp & nbsp J,
& nbsp & nbsp ColBeforeRefresh : integer
& nbsp & nbsp PIDContentsBeforeRefresh : string
& nbsp & nbsp PriorityClass : DWord
begin
& nbsp & nbsp ColBeforeRefresh := Col
& nbsp & nbsp PIDContentsBeforeRefresh := Células[1, Fila]
& nbsp & nbsp Realizar(WM_SETREDRAW, 0, 0)
& nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp InitGridForWinXX
& nbsp & nbsp & nbsp & nbsp aHandle := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0)
& nbsp & nbsp & nbsp & nbsp si aHandle <> 0 then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ProcessEntry32.dwSize := SizeOf(TProcessEntry32)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FoundOne := Process32First(aHandle, ProcessEntry32)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras FoundOne hacer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ExeFile := ProcessEntry32.szExeFile
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Células[0, número de filas - 1] := ExtractFileName(ExeFile)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Células[1, número de filas - 1] := IntToStr(ProcessEntry32.th32ProcessID)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PriorityClass := GetPriorityClass(ProcessEntry32.th32ProcessID)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si PriorityClass <> 0 then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp caso PriorityClass de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp HIGH_PRIORITY_CLASS: las Células[2, número de filas - 1] := 'Alto'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp IDLE_PRIORITY_CLASS: las Células[2, número de filas - 1] := 'Inactivo'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp NORMAL_PRIORITY_CLASS: las Células[2, número de filas - 1] := 'Normal'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp REALTIME_PRIORITY_CLASS : las Células[2, Número de filas - 1] := 'tiempo real'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Células[2, número de filas - 1] := IntToStr(ProcessEntry32.pcPriClassBase)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Células[3, número de filas - 1] := ExtractFilePath(ExeFile)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp RowCount := Número de filas 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ProcessEntry32.dwSize := SizeOf(TProcessEntry32)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FoundOne := Process32Next(aHandle, ProcessEntry32)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp CloseHandle(ahandle)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp si RowCount > 2 y
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp RowCount := número de filas - 1
& nbsp & nbsp & nbsp & nbsp FProcessCount := número de filas - 1
& nbsp & nbsp & nbsp & nbsp J :A = 1 número de filas - 1 hacer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si las Células[1, J] = PIDContentsBeforeRefresh, a continuación,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Col := ColBeforeRefresh
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Fila := J
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Break
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp Realizar(WM_SETREDRAW, 1, 0)
& nbsp & nbsp & nbsp & nbsp Invalidar
& nbsp & nbsp final
fin
procedimiento TggProcessViewer.Getprocesses
var
& nbsp & nbsp HandlePSAPI_DLL : THandle
begin
& nbsp & nbsp HandlePSAPI_DLL := LoadLibrary(cPSAPIDLL)
& nbsp & nbsp si (HandlePSAPI_DLL <> 0) entonces //Donde en NT/2000...
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @EnumProcesses := GetProcAddress(HandlePSAPI_DLL, 'EnumProcesses')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @GetModuleBaseNameA := GetProcAddress(HandlePSAPI_DLL, 'GetModuleBaseNameA')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @GetModuleFileNameExA := GetProcAddress(HandlePSAPI_DLL, 'GetModuleFileNameExA')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @EnumProcessModules := GetProcAddress(HandlePSAPI_DLL, 'EnumProcessModules')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetProcessesOnNT
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FreeLibrary(HandlePSAPI_DLL)
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp else //Donde en Win95/98/ME
& nbsp & nbsp & nbsp & nbsp GetProcessesOnWinXX
fin
final.
Visor de proceso componente
Visor de proceso componente : Multi-millones de consejos para hacer su vida mas facil.
Un Componente que muestra todos los procesos en ejecucion, no solo en WinNT pero tambien
en windows 98/95 !
Un Componente que muestra todos los procesos en ejecucion, no solo en WinNT pero
tambien en windows 98/95 !
tambien tiene un metodo publico calld KillSelectedProcess, supongo que usted
puede averiguar lo que hace...
me ha ahorrado un monton de problemas y me salvo un monton de necesidades
reiniciar el sistema en mi windows98 maquina...
bueno, aqui esta la fuente :
Lo que tenemos que hacer es hacer una nueva unidad, copia este texto en
y guardar la unidad como ggProcessViewer.
a Continuacion, usted puede instalar en su componente de palets mediante el uso de la
delphi menu principal, Componente/Install Component...
Tienen un monton de diversion...
unidad de ggProcessViewer
interfaz
usos
& nbsp & nbsp Windows, SysUtils, Classes, los Controles, las redes, ExtCtrls, mensajes,
& nbsp & nbsp tlHelp32, Cuadros de dialogo
tipo
//NT Funciones para la obtencion de la informacion de proceso :
& nbsp & nbsp TEnumProcesses = function(lpidProcess: LPDWORD cb: DWORD
& nbsp & nbsp & nbsp & nbsp var cbNeeded: DWORD): BOOL StdCall //externo cPSAPIDLL
& nbsp & nbsp TGetModuleBaseNameA = function(hProcess: THandle hModule: HMODULE
& nbsp & nbsp & nbsp & nbsp lpBaseName: PAnsiChar nSize: DWORD): DWORD StdCall //externo cPSAPIDLL
& nbsp & nbsp TGetModuleFileNameExA = function(hProcess: THandle hModule: HMODULE
& nbsp & nbsp & nbsp & nbsp lpFilename: PAnsiChar nSize: DWORD): DWORD StdCall //externo cPSAPIDLL
& nbsp & nbsp TEnumProcessModules = function (hProcess: THandle lphModule: LPDWORD
& nbsp & nbsp & nbsp & nbsp cb: DWORD var lpcbNeeded: DWORD): BOOL StdCall //externo cPSAPIDLL
& nbsp & nbsp TPByte = ^TByte
& nbsp & nbsp TByte = array[0..0] de bytes
& nbsp & nbsp ThackWinControl = clase(TWinControl)
& nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp propiedad de Texto
& nbsp & nbsp final
& nbsp & nbsp ThackGraphicControl = clase(TGraphicControl)
& nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp propiedad Caption
& nbsp & nbsp final
& nbsp & nbsp TProcessTimeType = (ptCreationTime, ptExitTime, ptKernelTime,
& nbsp & nbsp & nbsp & nbsp ptUserTime, ptCPUTime)
& nbsp & nbsp TAfterRefreshProcesses = procedimiento(Sender: TObject) del objeto
& nbsp & nbsp TBeforeRefreshProcesses = procedimiento(Sender: TObject) del objeto
& nbsp & nbsp TggProcessViewer = clase(TStringGrid)
& nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp FProcessCount : integer
& nbsp & nbsp & nbsp & nbsp FAutoRefresh : boolean
& nbsp & nbsp & nbsp & nbsp FAfterRefreshProcesses : TAfterRefreshProcesses
& nbsp & nbsp & nbsp & nbsp FBeforeRefreshProcesses : TBeforeRefreshProcesses
& nbsp & nbsp & nbsp & nbsp RefreshTimer : TTimer
& nbsp & nbsp & nbsp & nbsp procedimiento InitGridForNT
& nbsp & nbsp & nbsp & nbsp procedimiento Getprocesses
& nbsp & nbsp & nbsp & nbsp procedimiento GetProcessesOnNT
& nbsp & nbsp & nbsp & nbsp funcion SetProcessCount: integer
& nbsp & nbsp & nbsp & nbsp procedimiento GetProcessCount(const Valor: integer)
& nbsp & nbsp & nbsp & nbsp procedimiento GetTheProcessTimes(PID: integer)
& nbsp & nbsp & nbsp & nbsp procedimiento SetAutoRefresh(const Value: boolean)
& nbsp & nbsp & nbsp & nbsp procedimiento TimerAutoRefresh(Sender: TObject)
& nbsp & nbsp & nbsp & nbsp procedimiento InitGridForWinXX
& nbsp & nbsp & nbsp & nbsp procedimiento GetProcessesOnWinXX
& nbsp & nbsp protegido
& nbsp & nbsp & nbsp & nbsp //Adress los titulares de los procedimientos para el NT
& nbsp & nbsp & nbsp & nbsp EnumProcesses : TEnumProcesses
& nbsp & nbsp & nbsp & nbsp GetModuleBaseNameA : TGetModuleBaseNameA
& nbsp & nbsp & nbsp & nbsp GetModuleFileNameExA : TGetModuleFileNameExA
& nbsp & nbsp & nbsp & nbsp EnumProcessModules : TEnumProcessModules
& nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp constructor Create(AOwner: TComponent) reemplazar
& nbsp & nbsp & nbsp & nbsp destructor Destruir reemplazar
& nbsp & nbsp & nbsp & nbsp procedimiento de Actualizacion
& nbsp & nbsp & nbsp & nbsp procedimiento KillSelectedProcess
& nbsp & nbsp publicado
& nbsp & nbsp & nbsp & nbsp propiedad DoubleBuffered
& nbsp & nbsp & nbsp & nbsp propiedad ProcessCount: Entero leer SetProcessCount escribir GetProcessCount
& nbsp & nbsp & nbsp & nbsp propiedad Autorefresco: Boolean leer FAutoRefresh escribir SetAutoRefresh
& nbsp & nbsp & nbsp & nbsp propiedad AfterRefreshProcesses: TAfterRefreshProcesses
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp leer FAfterRefreshProcesses escribir FAfterRefreshProcesses
& nbsp & nbsp & nbsp & nbsp propiedad BeforeRefreshProcesses: TBeforeRefreshProcesses
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp leer FBeforeRefreshProcesses escribir FBeforeRefreshProcesses
& nbsp & nbsp final
procedimiento de Registro
const
& nbsp & nbsp cPSAPIDLL = 'PSAPI.dll'
& nbsp & nbsp ProcessBasicInformation = 0
aplicacion
procedimiento de Registro
begin
& nbsp & nbsp RegisterComponents('GuidoG', [TggProcessViewer])
fin
{ TggProcessViewer }
constructor TggProcessViewer.Create(AOwner: TComponent)
begin
& nbsp & nbsp heredado
& nbsp & nbsp RefreshTimer := TTimer.Create(Self)
& nbsp & nbsp RefreshTimer.OnTimer := TimerAutoRefresh
& nbsp & nbsp FixedCols := 0
& nbsp & nbsp DefaultRowHeight := 15
& nbsp & nbsp ColWidths[0] := 120
& nbsp & nbsp ColWidths[1] := 60
& nbsp & nbsp ColWidths[2] := 50
& nbsp & nbsp ColWidths[3] := 360
& nbsp & nbsp Opciones := Opciones - [goVertLine, goHorzLine]
& nbsp & nbsp & nbsp & nbsp [goDrawFocusSelected, goThumbTracking, goColSizing, goRowSizing]
& nbsp & nbsp GetProcesses
& nbsp & nbsp FAutoRefresh := TRUE
fin
procedimiento TggProcessViewer.InitGridForNT
begin
& nbsp & nbsp ColCount := 7
& nbsp & nbsp RowCount := 2
& nbsp & nbsp Celulas[0, 0] := 'Proceso'
& nbsp & nbsp Celulas[1, 0] := 'PID'
& nbsp & nbsp Celulas[2, 0] := 'tiempo de CPU'
& nbsp & nbsp Celulas[3, 0] := 'Kernel de tiempo'
& nbsp & nbsp Celulas[4, 0] := 'tiempo de Usuario'
& nbsp & nbsp Celulas[5, 0] := 'Prioridad'
& nbsp & nbsp Celulas[6, 0] := 'Ubicacion'
& nbsp & nbsp Celulas[0, 1] := '
& nbsp & nbsp Celulas[1, 1] := '
& nbsp & nbsp Celulas[2, 1] := '
& nbsp & nbsp Celulas[3, 1] := '
& nbsp & nbsp Celulas[4, 1] := '
& nbsp & nbsp Celulas[5, 1] := '
& nbsp & nbsp Celulas[6, 1] := '
fin
procedimiento TggProcessViewer.InitGridForWinXX
begin
& nbsp & nbsp ColCount := 4
& nbsp & nbsp RowCount := 2
& nbsp & nbsp Celulas[0, 0] := 'Proceso'
& nbsp & nbsp Celulas[1, 0] := 'PID'
& nbsp & nbsp Celulas[2, 0] := 'Prioridad'
& nbsp & nbsp Celulas[3, 0] := 'Ubicacion'
& nbsp & nbsp Celulas[0, 1] := '
& nbsp & nbsp Celulas[1, 1] := '
& nbsp & nbsp Celulas[2, 1] := '
& nbsp & nbsp Celulas[3, 1] := '
fin
procedimiento TggProcessViewer.GetProcessesOnNT
var
& nbsp & nbsp I : Integer
& nbsp & nbsp pidNeeded : DWORD
& nbsp & nbsp PIDList : array[0..1000] of Integer
& nbsp & nbsp PIDName : array [0..MAX_PATH - 1] of char
& nbsp & nbsp PH : THandle
& nbsp & nbsp hMod : HMODULE
& nbsp & nbsp dwSize2 : DWORD
& nbsp & nbsp J,
& nbsp & nbsp ColBeforeRefresh : integer
& nbsp & nbsp PIDContentsBeforeRefresh : string
begin
& nbsp & nbsp ColBeforeRefresh := Col
& nbsp & nbsp PIDContentsBeforeRefresh := Celulas[1, Fila]
& nbsp & nbsp Realizar(WM_SETREDRAW, 0, 0)
& nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp InitGridForNT
& nbsp & nbsp & nbsp & nbsp si no EnumProcesses(@PIDList, 1000, pidNeeded), a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp elevar la Excepcion.Create('PSAPI.DLL no se ha encontrado! Esta usted seguro de que '
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'esta ejecutando windows NT/Y2K ?')
& nbsp & nbsp & nbsp & nbsp for i := 0 a (pidNeeded div SizeOf (Entero)- 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & bsp & nbsp & nbsp & nbsp & nbsp PH := OpenProcess(PROCESS_QUERY_INFORMATION o PROCESS_VM_READ,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FALSO, PIDList[I])
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si el PH <> 0 then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si GetModuleFileNameExA(PH, 0, PIDName, SizeOf(PIDName)) > 0, entonces
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si EnumProcessModules(PH, @hMod, SizeOf(hMod), dwSize2) a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetModuleFileNameExA(PH, hMod, PIDName, SizeOf(PIDName))
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Celulas[0, numero de filas - 1] := ExtractFileName(PIDName)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Celulas[1, numero de filas - 1] := IntToStr(PIDList[I])
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetTheProcessTimes(PIDList[I])
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp caso GetPriorityClass(PH) de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp HIGH_PRIORITY_CLASS: las Celulas[5, numero de filas - 1] := 'Alto'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp IDLE_PRIORITY_CLASS: las Celulas[5, numero de filas - 1] := 'Inactivo'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp NORMAL_PRIORITY_CLASS: las Celulas[5, numero de filas - 1] := 'Normal'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp REALTIME_PRIORITY_CLASS : las Celulas[5, numero de filas - 1] := 'Tiempo real'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Celulas[6, Numero de filas - 1] := ExtractFilePath(PIDName)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp RowCount := Numero de filas 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp CloseHandle(PH)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp si RowCount > 2 y
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp RowCount := numero de filas - 1
& nbsp & nbsp & nbsp & nbsp FProcessCount := numero de filas - 1
& nbsp & nbsp & nbsp & nbsp para J := 1 hasta numero de filas - 1 hacer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si las Celulas[1, J] = PIDContentsBeforeRefresh, a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Col := ColBeforeRefresh
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Fila := J
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Break
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp Realizar(WM_SETREDRAW, 1, 0)
& nbsp & nbsp & nbsp & nbsp Invalidar
& nbsp & nbsp final
fin
procedimiento TggProcessViewer.GetTheProcessTimes(PID: integer)
var
& nbsp & nbsp lpLocalFileTime : TFileTime
& nbsp & nbsp lpSystemTime : TSystemTime
& nbsp & nbsp PH : THandle
& nbsp & nbsp hProcess : THandle
& nbsp & nbsp lpCreationTime,
& nbsp & nbsp lpExitTime,
& nbsp & nbsp lpKernelTime,
& nbsp & nbsp lpUserTime : TFileTime
& nbsp & nbsp KernelDay,
& nbsp & nbsp UserDay : integer
& nbsp & nbsp KernelTime,
& nbsp & nbsp UserTime : TDateTime
& nbsp & nbsp Resultado,
& nbsp & nbsp strHours : string
begin
& nbsp & nbsp Resultado := 'n/a'
& nbsp & nbsp hProcess := PID
& nbsp & nbsp PH := OpenProcess(PROCESS_QUERY_INFORMATION, FALSO, hProcess)
& nbsp & nbsp si el PH <> 0 then
& nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetProcessTimes(PH, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FileTimeToLocalFileTime(lpCreationTime, lpLocalFileTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp //Obtener el kernel de tiempo y formato
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FileTimeToSystemTime(lpKernelTime, lpSystemTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp KernelDay := lpSystemTime.wDay
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp KernelTime := SystemTimeToDateTime(lpSystemTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := TimeToStr(KernelTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp strHours := Copy(Resultado, 1, Pos(':', Resultado) - 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Eliminar(Resultado, 1, Pos(':', Resultado) - 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Celulas[3, numero de filas - 1] := IntToStr(((KernelDay - 1) * 24)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp StrToInt(strHours)) El resultado es
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp //Obtener el tiempo de los usuarios y el formato
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FileTimeToSystemTime(lpUserTime, lpSystemTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp UserDay := lpSystemTime.wDay
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp UserTime := SystemTimeToDateTime(lpSystemTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := TimeToStr(UserTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp strHours := Copy(Resultado, 1, Pos(':', Resultado) - 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Eliminar(Resultado, 1, Pos(':', Resultado) - 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Celulas[4, numero de filas - 1] := IntToStr(((UserDay - 1) * 24)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp - nbsp & nbsp StrToInt(strHours)) Resultado //TimeToStr(UserTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp //Calcular el tiempo de cpu y el formato
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Resultado := TimeToStr(UserTime KernelTime)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp strHours := Copy(Resultado, 1, Pos(':', Resultado) - 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Eliminar(Resultado, 1, Pos(':', Resultado) - 1)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Celulas[2, numero de filas - 1] := IntToStr(((UserDay - KernelDay) * 24)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp StrToInt(strHours)) El resultado es
& nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp CloseHandle(PH)
& nbsp & nbsp & nbsp & nbsp final
fin
procedimiento TggProcessViewer.KillSelectedProcess
var
& nbsp & nbsp PH : THandle
& nbsp & nbsp lpExitCode : DWord
& nbsp & nbsp hProcess : el Cardenal
begin
& nbsp & nbsp hProcess := StrToInt64(Celulas[1, Fila])
& nbsp & nbsp PH := OpenProcess(PROCESS_TERMINATE o PROCESS_QUERY_INFORMATION,
& nbsp & nbsp & nbsp & nbsp FALSO, hProcess)
& nbsp & nbsp si el PH <> 0 then
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si GetExitCodeProcess(PH, lpExitCode) a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si MessageBox(Mango, PChar('lo que realmente quieres de mi para intentar'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'matar a este proceso ?'), 'Por favor, Confirmar',
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MB_YESNO) = mrYES, a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp TerminateProcess(PH, lpExitCode)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MessageBox(Mango, PChar('debe estar muerto ahora...'),
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PChar('Check it out...'), MB_OK)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp MessageBox(Mango, PChar('no se Pudo recuperar la ExitCode'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp 'para este proceso'. #13 #13
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp SysErrorMessage(GetLastError)),
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PChar('Algo salio mal...'), MB_OK)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp CloseHandle(PH)
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp MessageBox(Mango, PChar('no se Pudo obtener acceso a este proceso'.
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp #13 #13 SysErrorMessage(GetLastError)),
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PChar('Algo salio mal...'), MB_OK) Actualizar
fin
procedimiento TggProcessViewer.Actualizacion
begin
& nbsp & nbsp si se ha asignado(FBeforeRefreshProcesses) y no
& nbsp & nbsp & nbsp & nbsp (csLoading en ComponentState), a continuacion,
& nbsp & nbsp & nbsp & nbsp FBeforeRefreshProcesses(Auto)
& nbsp & nbsp GetProcesses
& nbsp & nbsp si se ha asignado(FAfterRefreshProcesses) y no
& nbsp & nbsp & nbsp & nbsp (csLoading en ComponentState) a continuacion,
& nbsp & nbsp & nbsp & nbsp FAfterRefreshProcesses(Auto)
fin
funcion TggProcessViewer.SetProcessCount: integer
begin
& nbsp & nbsp Resultado := FProcessCount
fin
procedimiento TggProcessViewer.GetProcessCount(const Valor: integer)
begin
& nbsp & nbsp FProcessCount := numero de filas - 1
fin
procedimiento TggProcessViewer.SetAutoRefresh(const Value: boolean)
begin
& nbsp & nbsp FAutoRefresh := Valor
& nbsp & nbsp RefreshTimer.Enabled := FAutoRefresh
fin
destructor TggProcessViewer.Destruir
begin
& nbsp & nbsp FreeAndNil(RefreshTimer)
& nbsp & nbsp heredado
fin
procedimiento TggProcessViewer.TimerAutoRefresh(Sender: TObject)
begin
& nbsp & nbsp RefreshTimer.OnTimer := NIL
& nbsp & nbsp Actualizar
& nbsp & nbsp RefreshTimer.OnTimer := TimerAutoRefresh
fin
procedimiento TggProcessViewer.GetProcessesOnWinXX
var
& nbsp & nbsp aHandle : THandle
& nbsp & nbsp FoundOne : bool
& nbsp & nbsp ProcessEntry32 : TProcessEntry32
& nbsp & nbsp ExeFile : string
& nbsp & nbsp J,
& nbsp & nbsp ColBeforeRefresh : integer
& nbsp & nbsp PIDContentsBeforeRefresh : string
& nbsp & nbsp PriorityClass : DWord
begin
& nbsp & nbsp ColBeforeRefresh := Col
& nbsp & nbsp PIDContentsBeforeRefresh := Celulas[1, Fila]
& nbsp & nbsp Realizar(WM_SETREDRAW, 0, 0)
& nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp InitGridForWinXX
& nbsp & nbsp & nbsp & nbsp aHandle := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0)
& nbsp & nbsp & nbsp & nbsp si aHandle <> 0 then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp probar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ProcessEntry32.dwSize := SizeOf(TProcessEntry32)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FoundOne := Process32First(aHandle, ProcessEntry32)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp mientras FoundOne hacer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ExeFile := ProcessEntry32.szExeFile
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Celulas[0, numero de filas - 1] := ExtractFileName(ExeFile)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Celulas[1, numero de filas - 1] := IntToStr(ProcessEntry32.th32ProcessID)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp PriorityClass := GetPriorityClass(ProcessEntry32.th32ProcessID)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si PriorityClass <> 0 then
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp caso PriorityClass de
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp HIGH_PRIORITY_CLASS: las Celulas[2, numero de filas - 1] := 'Alto'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp IDLE_PRIORITY_CLASS: las Celulas[2, numero de filas - 1] := 'Inactivo'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp NORMAL_PRIORITY_CLASS: las Celulas[2, numero de filas - 1] := 'Normal'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp REALTIME_PRIORITY_CLASS : las Celulas[2, Numero de filas - 1] := 'tiempo real'
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp else
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Celulas[2, numero de filas - 1] := IntToStr(ProcessEntry32.pcPriClassBase)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Celulas[3, numero de filas - 1] := ExtractFilePath(ExeFile)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp RowCount := Numero de filas 1
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp ProcessEntry32.dwSize := SizeOf(TProcessEntry32)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FoundOne := Process32Next(aHandle, ProcessEntry32)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp CloseHandle(ahandle)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp & nbsp & nbsp si RowCount > 2 y
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp RowCount := numero de filas - 1
& nbsp & nbsp & nbsp & nbsp FProcessCount := numero de filas - 1
& nbsp & nbsp & nbsp & nbsp J :A = 1 numero de filas - 1 hacer
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp si las Celulas[1, J] = PIDContentsBeforeRefresh, a continuacion,
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Col := ColBeforeRefresh
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Fila := J
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Break
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp finalmente
& nbsp & nbsp & nbsp & nbsp Realizar(WM_SETREDRAW, 1, 0)
& nbsp & nbsp & nbsp & nbsp Invalidar
& nbsp & nbsp final
fin
procedimiento TggProcessViewer.Getprocesses
var
& nbsp & nbsp HandlePSAPI_DLL : THandle
begin
& nbsp & nbsp HandlePSAPI_DLL := LoadLibrary(cPSAPIDLL)
& nbsp & nbsp si (HandlePSAPI_DLL <> 0) entonces //Donde en NT/2000...
& nbsp & nbsp & nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @EnumProcesses := GetProcAddress(HandlePSAPI_DLL, 'EnumProcesses')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @GetModuleBaseNameA := GetProcAddress(HandlePSAPI_DLL, 'GetModuleBaseNameA')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @GetModuleFileNameExA := GetProcAddress(HandlePSAPI_DLL, 'GetModuleFileNameExA')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp @EnumProcessModules := GetProcAddress(HandlePSAPI_DLL, 'EnumProcessModules')
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp GetProcessesOnNT
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FreeLibrary(HandlePSAPI_DLL)
& nbsp & nbsp & nbsp & nbsp final
& nbsp & nbsp else //Donde en Win95/98/ME
& nbsp & nbsp & nbsp & nbsp GetProcessesOnWinXX
fin
final.
Visor de proceso componente
By Consejos Y Trucos
Visor de proceso componente : Multi-millones de consejos para hacer su vida más fácil.