Ir al contenido


Foto

Cerrar una aplicación bloqueada en windows 7


  • Por favor identifícate para responder
5 respuestas en este tema

#1 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 21 agosto 2015 - 10:21

Buen dia compañeros, tengo un pequeño problema de hace varios años atras con windows 7, resulta que a veces se bloquean mis aplicaciones al ejecutar, al darle varios clicks sobre el icono se va a Procesos de windows, y si abre el Administrador de Tareas en la pestaña PROCESOS, aparece varias veces mi aplicación, se tiene que finalizar a cada una, apenas asi vuelve a entrar, esto pasa a lo largo no es comun, habia pensado en hacer que al cargar el programa tomar el handle de la aplicación y hace un barrido de las aplicaciones ejecutadas y finalizar si se encuentra mas de una vez sin afectar a la nueva por el handle, no se si me explique ??

 

Espero sus sugerencias..

 

gracias.


  • 0

#2 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 21 agosto 2015 - 10:37

Te recomiendo que compiles tu aplicación con MadExcept. La parte de gestión de errores es gratuita.

 

http://madshi.net/ma...Description.htm

 

Este gestor de errores puede detectar que tu aplicación se queda bloqueada (no responde durante más de N segundos) y generar un informe para que sepas donde se ha creado el problema, así como cerrar automáticamente la aplicación, o reiniciarla.

 

Saludos.


  • 1

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 21 agosto 2015 - 10:56

Mientras revisas la propuesta de Marc, puedes ir intentando con ésto:
 
 

delphi
  1. function KillTask(ExeFileName: string): Integer;
  2. const
  3. PROCESS_TERMINATE = $0001;
  4. var
  5. ContinueLoop: BOOL;
  6. FSnapshotHandle: THandle;
  7. FProcessEntry32: TProcessEntry32;
  8. begin
  9. Result := 0;
  10. FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  11. FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  12. ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  13. while Integer(ContinueLoop) <> 0 do
  14. begin
  15. if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
  16. UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
  17. UpperCase(ExeFileName))) then
  18. Result := Integer(TerminateProcess(
  19. OpenProcess(PROCESS_TERMINATE,
  20. BOOL(0),
  21. FProcessEntry32.th32ProcessID),
  22. 0));
  23. ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  24. end;
  25. CloseHandle(FSnapshotHandle);
  26. end;

Su uso sería:


delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3. KillTask('notepad.exe');
  4. end;


  • 1

#4 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 21 agosto 2015 - 11:02

Muchas gracias compañeros, voy a probar lo que me sugieren los mantengo informados...

 

Saludos.


  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 21 agosto 2015 - 05:02

Si lo que quieres es matar todos los procesos con un determinado nombre menos la actual, que es lo que entiendo y asegurar el tiro, debes identificar el PID de la aplicación matadora para no suidicarse, además deberías darte privilegios debug:
 

delphi
  1. //uses TLHelp32;
  2.  
  3. function EnablePrivilege(name: String; Enable: boolean = true): boolean;
  4. var
  5. hToken: Cardinal;
  6. priv: TOKEN_PRIVILEGES;
  7. begin
  8. priv.PrivilegeCount:= 1;
  9. priv.Privileges[0].Attributes:= 0;
  10. if Enable then priv.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
  11. LookupPrivilegeValue(nil, PCHAR(name), priv.Privileges[0].Luid);
  12. OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
  13. AdjustTokenPrivileges (hToken, FALSE, priv, sizeof(priv), nil, PDWORD(nil)^);
  14. Result:= (GetLastError = ERROR_SUCCESS);
  15. CloseHandle (hToken);
  16. end;
  17.  
  18. procedure KillProcess(FileName: String);
  19. var
  20. Process, hSysSnapshot: THandle;
  21. PE: TPROCESSENTRY32;
  22. begin
  23. EnablePrivilege('SeDebugPrivilege');
  24. PE.dwSize:= sizeof(TPROCESSENTRY32);
  25. hSysSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  26. if (hSysSnapshot <> INVALID_HANDLE_VALUE) and Process32First(hSysSnapshot, PE) then
  27. repeat
  28. if (lstrcmpi(PE.szExeFile, PAnsiChar(FileName)) = 0) and (GetCurrentProcessID <> PE.th32ProcessID) then
  29. begin
  30. Process:= OpenProcess(PROCESS_TERMINATE, false, PE.th32ProcessID);
  31. if Process <> 0 then
  32. begin
  33. TerminateProcess(Process, 0);
  34. CloseHandle(process);
  35. end;
  36. end;
  37. until not Process32Next(hSysSnapshot, PE);
  38. CloseHandle(hSysSnapshot);
  39. EnablePrivilege('SeDebugPrivilege', false);
  40. end;


Ese código lo puedes colocar en el evento OnCreate o mejor aún, antes de crear ningún formulario:

delphi
  1. program Project1;
  2. uses
  3. Forms,
  4. Unit1 in 'Unit1.pas' {Form1};
  5.  
  6. {$R *.res}
  7.  
  8. begin
  9. KillProcess('Project1.exe'); // Matas a todos menos a ti mismo...
  10.  
  11. Application.Initialize;
  12. Application.CreateForm(TForm1, Form1);
  13. Application.Run;
  14. end.



Saludos.
  • 1

#6 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 21 agosto 2015 - 05:16

muchas gracias compañero, ya estoy haciendo pruebas, te aviso que paso...

 

saludos.


  • 0




IP.Board spam blocked by CleanTalk.