Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-02-2008
Avatar de Lord Delfos
Lord Delfos Lord Delfos is offline
Miembro
 
Registrado: ene 2008
Ubicación: Tandil, Argentina
Posts: 558
Poder: 17
Lord Delfos Va por buen camino
Cerrar otra aplicación con ventana invisible

Hola de nuevo.

A ver si alguien sabe esto.

Tengo dos programas. Uno corre normalmente y el otro en la SysTray.

La cosa es que cuando uno arranca el programa normal, éste cierra el que está corriendo en la SysTray.

Originalmente le enviaba un mensaje WM_CLOSE con SendMessage, pero resulta que si la ventana no está visible... bueno, explota.

He estado buscando en Internet pero, la verdad, no he encontrado algo que funcione realmente bien y no sean tres unidades de 400 líneas con partes en assembler y un librito para rezar mientras se compila...

¿Alguna idea? ¿Alguna punta por donde comenzar?

Gracias miles.
Responder Con Cita
  #2  
Antiguo 03-02-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Tal vez "matar el proceso" de la aplicación, pero, ten en cuenta que matar un proceso implica que la aplicación en cuestión no se cerrará en condiciones, es decir, "no se enterará" de que ha sido "asesinada", si no me equivoco...

Código Delphi [-]
uses
  TlHelp32;

function MatarProcesos(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
  begin
    repeat
      if (lstrcmpi(PChar(nombre),@processEntry.szExeFile) = 0) then
      begin
        hProcess := OpenProcess(PROCESS_TERMINATE,
                     false,processEntry.th32ProcessID);
        result := TerminateProcess(hProcess,0);
        CloseHandle(hProcess);
      end;
    until not Process32Next(hSnapshot,processEntry);
  end;
  CloseHandle(hSnapshot);
end;

Y ten en cuenta además que lo anterior mataría todos los procesos con el mismo nombre, es decir, que si algún ejecutable se llama como el de la aplicación que quieres "matar", también este será "asesinado" sin piedad. En definitiva, que no sé si te servirá de algo o qué.
Responder Con Cita
  #3  
Antiguo 04-02-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

Pues yo creo que con esta rutina de Dec no tendrás que rezar nadita Lord. No la he probado pero tiene muy buena pinta. Excelente código David.

Hay por ahí un Begin y un End y un par de paréntesis que son innecesarios, y quizá convendría asegurar a los CloseHandle con un Try...Finally. Serían mis únicas observaciones.

Un abrazo rutinario.

Al González.
Responder Con Cita
  #4  
Antiguo 04-02-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Es muy posible que sea como dices Al. De hecho ese código no lo escribí yo (a tanto no he llegado) sino que lo adaptaría de alguno que encontré por ahí, pero, que, por el motivo que sea, no puedo citar, puesto que en el original (cierto proyecto mío) tampoco cito a su autor... y eso no puede querer decir (salvo excepciones) que no recuerdo al autor, ¡o que yo mismo lo escribí! Quién sabe... no, esto último no será.
Responder Con Cita
  #5  
Antiguo 05-02-2008
Avatar de Lord Delfos
Lord Delfos Lord Delfos is offline
Miembro
 
Registrado: ene 2008
Ubicación: Tandil, Argentina
Posts: 558
Poder: 17
Lord Delfos Va por buen camino
¡Gracias Dec!

Voy a probar este codiguín a ver qué sale. Lo del nombre no es tan problemático, porque como el programa en sí no se ve, puedo inventar nombes medios complicados...

Gracias de nuevo y saludongos.
Responder Con Cita
  #6  
Antiguo 22-04-2008
vejerf vejerf is offline
Miembro
 
Registrado: ene 2007
Posts: 206
Poder: 18
vejerf Va por buen camino
Buenas,
Buscando algún método para matar a una aplicación he dado con este hilo. Mi intención es "matar" al Google Earth cuando cierro mi aplicación ya que mi aplicación hace uso del GE. Al usar el método sugerido por Dec el GE no termina de cerrarse. Ocurre que finaliza la aplicación, pero da un error quedando como en segundo plano. El error dice que esa funcionalidad sólo está prevista para los suscriptores de Google Earth Plus. No hay algún método que sea aún más agresivo y que lo elimine como hace el administrador de tareas???

Gracias...
Responder Con Cita
  #7  
Antiguo 23-04-2008
alquimista alquimista is offline
Miembro
 
Registrado: ene 2008
Posts: 203
Poder: 17
alquimista Va por buen camino
En mi mata programas utilizo la siguiente rutina, sacada de internet y modificada algo:
POr supuesto no es perfecta pero mata los programas

Código Delphi [-]
function KillTask(ExeFileName: string): Integer;

var

  foto: Cardinal;
  datos: tagPROCESSENTRY32;
  p: array[0..512] of char;

  function QuitarSaltosLinea(Strs: String; CharReplace:String=#0):String;
       var
         Str:string;
       begin
         Str := AnsiReplaceStr(Strs, #$D, CharReplace);
         Result := AnsiReplaceStr(Str, #$A, CharReplace);
       end;

begin
  Result:=0;
  ExeFileName:=QuitarSaltosLinea(ExeFileName);
  strpcopy(p,ExeFileName);

  datos.dwSize := sizeOF(tagPROCESSENTRY32);
  foto := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  while Process32Next(foto, datos) do
  begin
      if (UpperCase(datos.szExeFile) = UpperCase(p)) then
        begin
         Result := Integer(TerminateProcess(
                          OpenProcess(
                          PROCESS_TERMINATE,
                          BOOL(1), datos.th32ProcessID), 0));
         end;
 
  end;
  CloseHandle(foto);
end;

para el WinXp o NT uses tlhelp32;

Si alguno de los programas se resiste se puede usar esto para ayudar:

Código Delphi [-]
function EnablePrivilege(PrivilegeName: PChar; Enable: Boolean): Boolean;
var
  hToken: THandle;
  Tp: TOKEN_PRIVILEGES;
  Luid: TLargeInteger;
begin
  Result:= FALSE;
  if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
  TOKEN_QUERY or TOKEN_READ or TOKEN_WRITE or TOKEN_ALL_ACCESS, hToken) then
      if LookupPrivilegeValue(nil,PrivilegeName,Luid) then
        begin
          Tp.PrivilegeCount:= 1;
          Tp.Privileges[0].Luid:= Luid;
            if Enable then
              Tp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED
            else
              Tp.Privileges[0].Attributes:= 0;
          Result:= AdjustTokenPrivileges(hToken,FALSE,Tp,0,nil,PDWORD(nil)^);
          CloseHandle(hToken);
        end;
end;


Código Delphi [-]
EnablePrivilege('SeDebugPrivilege', TRUE);

No se exactamente que es lo que hace pero creo que me sirvio


Ya me cuentas.
Responder Con Cita
  #8  
Antiguo 23-04-2008
vejerf vejerf is offline
Miembro
 
Registrado: ene 2007
Posts: 206
Poder: 18
vejerf Va por buen camino

Gracias por tu ayuda... pero al final no me funcionó...
Me da el mismo problema que con la función de dec... no termina de cerrarse... Aghhh es que no hay forma en esta vida de acabar de una vez por todas con el Google Earth jejeje

Gracias
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Activar una ventana al cerrar otra David OOP 3 17-09-2007 21:15:54
¿Cómo cerrar otra aplicación desde la mía? Alcolea Varios 1 22-03-2007 03:02:35
Cómo cerrar otra aplicacion desde mi aplicacion en Delphi 7 Gaby123 API de Windows 5 04-01-2007 22:44:51
En mi aplicacion MDI quiero crear una ventana hija desde otra ventana hija Durbed Varios 8 05-07-2005 11:51:54
Cerrar una ventana desde otra Aura OOP 9 16-05-2005 18:20:49


La franja horaria es GMT +2. Ahora son las 06:32:31.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi