Tenemos el PC lleno de programas de los que sólo usamos diariamente un porcentaje muy pequeño, muchos de ellos utilizan servicios o lanzadores que requieren ejecutarse al inicio del arranque del PC y que posteriormente se quedan en la máquina quitando recursos del sistema, de memoria y de CPU.
Yo lo he comprobado en mi máquina que va mucho mejor cuando la limpio de esos programas y para solucionar esto he realizado una utilidad que consta de dos partes:
1) Un archivo de texto llamado "ProcesosACerrar.txt" donde escribiremos línea a línea los programas que queremos eliminar, p.ej.
BSQLServer.exe
ACDaemon.exe
ACService.exe
y así sucesivamente
2) El software que elimina secuencialmente cada una de las tareas que va leyendo del fichero anterior.
¿Cómo veo los programas que se están ejecutando en mi sistema?
Desde Windows 8, pulsar Ctrl+Alt+Supr
y en el menú siguiente hacer clic en "Administrador de tareas"
En la ventana siguiente pulsar la pestaña "Detalles"
En la columna "Nombre" tenemos los nombres de los procesos que se están ejecutando actualmente en nuestro sistema.
¿Cómo lo hace?
Pues llamando a una utilidad del sistema llamada "taskkill"
Definición de TASKKILL en technet
Termina una o más tareas o procesos. Los procesos pueden ser terminados por los ID de proceso o por su nombre.
Sintaxis
taskkill [/ s Computer] [/ u Dominio \ Usuario [/ p Contraseña]]] [/ fi FilterName] [/ pid ProcessID] | [/ im Name][/ f] [/ t]
Parámetros
Nombre | Operadores | Valor |
---|---|---|
Hostname | eq, ne | Cualquier String válido. |
Status | eq, ne | RUNNING|NOT RESPONDING |
Imagename | eq, ne | Cualquier String válido. |
PID | eg, ne, gt,lt, ge, le | Cualquier entero positivo válido |
Session | eg, ne, gt,lt, ge, le | Cualquier número de sesión válido |
CPUTime | eq, ne, gt,lt, ge, le | Tiempo válido en el formato hh:mm:ss. El mm y ss deberían ser entre 0 y 59 y hh cualquier numero válido unsigned |
Memusage | eg, ne, gt,lt, ge, le | Cualquier entero positivo válido |
Username | eq, ne | Cualquier nombre de usuario ([Domain\]User). |
Services | eq, ne | Cualquier String válido. |
Windowtitle | eq, ne | Cualquier String válido. |
/ s Computer: Especifica el nombre o la dirección IP de un equipo remoto (no utilice barras invertidas). El valor predeterminado es el equipo local.
/ u dominio \ usuario: Ejecuta el comando con los permisos de cuenta del usuario especificado por usuario o dominio \ usuario. El valor predeterminado es el del actual usuario con sesión iniciada en el equipo que emite el comando.
/ p Contraseña: Especifica la contraseña de la cuenta de usuario que se especifica en la / u parámetro.
/ fi FilterName: Especifica los tipos de proceso (s) para incluir o excluir de la terminación. Los siguientes son nombres válidos de filtro, operadores y valores.
/ im ImageName: Especifica el nombre de la imagen del proceso que de ser terminado. Utilice el comodín (*) para especificar todos los nombres de las imágenes./ pid ProcessID: Especifica el ID de proceso del proceso de ser terminado.
/ f: Especifica que proceso (s) terminará inmediatamente. Este parámetro se ignora para procesos remotos; todos los procesos remotos se finalizaron de manera forzada.
/ t: Especifica para terminar todos los procesos hijos junto con el proceso padre, conocido comúnmente como un cierre en árbol.
/?: Muestra Ayuda en el símbolo del sistema.
Observaciones
El carácter comodín (*), sólo se acepta cuando se especifica junto con los filtros.
Terminación por procesos remotos se hará siempre con inmediatamente independientemente de si el / f se especifica el parámetro.
El suministro de un nombre de equipo al filtro HOSTNAME causará un apagado y será detenido todos los procesos.
Usar lista de tareas para determinar el ID de proceso (PID) para el proceso que tiene que ser terminado.
Taskkill es un reemplazo para la herramienta Kill .
Los siguientes ejemplos muestran cómo se puede utilizar el comando taskkill
taskkill /pid 1230 /pid 1241 /pid 1253
taskkill /f /fi "USERNAME eq NT AUTHORITY\SYSTEM" /im notepad.exe
taskkill /s srvmain /f /im notepad.exe
taskkill /s srvmain /u maindom\hiropln /p p@ssW23 /fi "IMAGENAME eq note*" /im *
taskkill /s srvmain /u maindom\hiropln /fi "USERNAME ne NT*" /im *
taskkill /f /fi "PID ge 1000" /im *
- Código del botón que inicia el proceso para eliminar los programas que constan en el archivo "ProcesosACerrar.txt"
procedure TForm1.Button1Click(Sender: TObject);
var
lista:tstringlist;
i:integer;
BEGIN
LISTA := TSTRINGLIST.CREATE;
TRY
lista.loadfromfile('ProcesosACerrar.txt');
for i:=0 to Lista.Count - 1 do
begin
if trim(lista.strings[i])<>'' then
begin
inicia ('taskkill','/F /IM '+lista.strings[i]);
end;
end;
FINALLY
lista.free;
END;
El código del procedimiento INICIA, lo que hace es capturar la salida del comando taskkill y lo almacena en tMemo utilizando un pipe
procedure tform1.inicia(cmd:string;parametros:string);
begin
CaptureConsoleOutput(cmd, parametros,
PROCEDURE(CONST Line: PAnsiChar)
BEGIN
memo1.Lines.Add(STRING(Line));
END
);
end;
PROCEDURE TForm1.CaptureConsoleOutput(CONST ACommand, AParameters: STRING;
CallBack: TArg < PAnsiChar > );
CONST
CReadBuffer = 40000;
VAR
saSecurity: TSecurityAttributes;
hRead: THandle;
hWrite: THandle;
suiStartup: TStartupInfo;
piProcess: TProcessInformation;
pBuffer: ARRAY[0..CReadBuffer] OF AnsiChar;
dBuffer: ARRAY[0..CReadBuffer] OF AnsiChar;
dRead: DWORD;
dRunning: DWORD;
dAvailable: DWORD;
BEGIN
saSecurity.nLength := SizeOf(TSecurityAttributes);
saSecurity.bInheritHandle := true;
saSecurity.lpSecurityDescriptor := NIL;
IF CreatePipe(hRead, hWrite, @saSecurity, 0) THEN
TRY
FillChar(suiStartup, SizeOf(TStartupInfo), #0);
suiStartup.cb := SizeOf(TStartupInfo);
suiStartup.hStdInput := hRead;
suiStartup.hStdOutput := hWrite;
suiStartup.hStdError := hWrite;
suiStartup.dwFlags := STARTF_USESTDHANDLES OR STARTF_USESHOWWINDOW;
suiStartup.wShowWindow := SW_HIDE;
IF CreateProcess(NIL, PChar(ACommand + ' ' + AParameters), @saSecurity,
@saSecurity, true, NORMAL_PRIORITY_CLASS, NIL, NIL, suiStartup,
piProcess) THEN
TRY
REPEAT
dRunning := WaitForSingleObject(piProcess.hProcess, 100);
PeekNamedPipe(hRead, NIL, 0, NIL, @dAvailable, NIL);
IF (dAvailable > 0) THEN
REPEAT
dRead := 0;
ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, NIL);
pBuffer[dRead] := #0;
OemToCharA(pBuffer, dBuffer);
CallBack(dBuffer);
UNTIL (dRead < CReadBuffer);
Application.ProcessMessages;
UNTIL (dRunning <> WAIT_TIMEOUT);
FINALLY
CloseHandle(piProcess.hProcess);
CloseHandle(piProcess.hThread);
END;
FINALLY
CloseHandle(hRead);
CloseHandle(hWrite);
END;
END;
Otra forma para cerrar procesos:
ResponderEliminarFUNCTION tform1.CerrarProcesos(nombre: STRING): boolean;
VAR
ModuleEntry: TModuleEntry32;
ProcessEntry: TProcessEntry32;
hSnapshot, hProcess: Cardinal;
BEGIN
result := false;
ModuleEntry.dwSize := SizeOf(TModuleEntry32);
ProcessEntry.dwSize := SizeOf(TProcessEntry32);
hSnapshot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
IF Process32First(hSnapshot, ProcessEntry) THEN
REPEAT
IF (lstrcmpi(PChar(nombre), @ProcessEntry.szExeFile) = 0) THEN
BEGIN
hProcess := OpenProcess(PROCESS_TERMINATE,
false, ProcessEntry.th32ProcessID);
result := TerminateProcess(hProcess, 0);
if result then memo2.lines.add(Nombre+' - '+'Cerrado')
else memo2.lines.add(Nombre+' - '+'Error al cerrar.');
CloseHandle(hProcess);
END;
UNTIL NOT Process32Next(hSnapshot, ProcessEntry);
CloseHandle(hSnapshot);
END;