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 13-07-2010
xjre xjre is offline
Miembro
 
Registrado: feb 2008
Posts: 13
Poder: 0
xjre Va por buen camino
Recibir mensaje al ejecutarse programa

Buenas a todos


Estuve buscando en los foros y en google y no pude encontrar información al respecto. La intuición me dice que tiene que haber alguna forma, tal vez uds me puedan ayudar.

La cosa es bastante sencilla, lo que quiero saber es, mientras corro una aplicación delphi, saber si se ejecuta otra aplicacion. Por ejemplo, si mientras se esta corriendo mi aplicacion delphi alguien ejecuta un notepad, que la aplicación ejecute X rutina.

Se me ocurre que tiene que haber una especie de mensaje que windows envie al ejecutarse una aplicación.

Se que con un FindWindow llamado cada X segundos podría saber si se esta ejecutando o no, pero querria evitar el estar ejecutando constantemente ese procedimiento.

Desde ya, muchas gracias a todos
Responder Con Cita
  #2  
Antiguo 13-07-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Revisa este hilo.

Saludos.
Responder Con Cita
  #3  
Antiguo 13-07-2010
Avatar de bosster_018
bosster_018 bosster_018 is offline
Miembro
 
Registrado: nov 2009
Ubicación: Bolivia
Posts: 127
Poder: 15
bosster_018 Va por buen camino
Esto lo tengo hace tiempo

Esto lo encontré hace tiempo en el ClubDelphi, donde se mostraba la forma de saber si algún proceso se está ejecutando.

Cita:
Primero agrega un edit y luego un boton.
En el botón escribes esto:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject); 
var 
  Abrir_Procesos : Integer; 
  Leer_Procesos : TProcessEntry32; 
  Seguir_Leyendo: BOOL; 
  Preguntar : string; 
begin 
  // Abre y lee la lista de procesos en éste momento 
  Abrir_Procesos := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
  Leer_Procesos.dwSize := SizeOf(Leer_Procesos); 
 
  // Acceder al primer proceso 
  Seguir_Leyendo := Process32First(Abrir_Procesos, Leer_Procesos); 
 
  // Condicion para recorer los procesos activos hasta que sea igual a 0 
    while (Integer(Seguir_Leyendo) <> 0) do 
    begin 
      // Añadirlo a la lista 
      preguntar:= ExtractFileName(Leer_Procesos.szExeFile); 
      // Empezar a leer los procesos 
      Seguir_Leyendo := Process32Next(Abrir_Procesos, Leer_Procesos); 
      // Preguntar si encontró el proceso 
        if Preguntar = Edit1.Text then 
        begin 
          ShowMessage('Encontrado'); 
          // igualamos a 0 para que deje de buscar 
          integer(Seguir_Leyendo):= 0; 
        end 
        else 
        begin 
          //ya no hay procesos que leer (0) y no se encontró el proceso buscado 
          if (integer(Seguir_Leyendo) = 0) and (Preguntar <> Edit1.Text) then 
            ShowMessage('No encontrado'); 
        end; 
    end; 
  // cerrar la lectura de procesos 
  CloseHandle(Abrir_Procesos); 
end;


Donde dice "Edit1.text" puedes cambiarle por el nombre del proceso que quieres saber si se ejecuta en ese momento, por ejemplo "notepad.exe" o cambiar la condición para saber si se está ejecutando uno u otro proceso: en este caso el notepad o el M$ Word


Código Delphi [-]
if Preguntar = 'notepad.exe' or Preguntar = 'winword.exe' then 
        begin 
          ShowMessage('Encontrado'); 
          // igualamos a 0 para que deje de buscar 
          integer(Seguir_Leyendo):= 0; 
        end 
        else 
        begin 
          //ya no hay procesos que leer (0) y no se encontró el proceso  buscado 
          if (integer(Seguir_Leyendo) = 0) and (Preguntar <>  Edit1.Text) then 
            ShowMessage('No encontrado'); 
        end;


Y así sucesivamente...
Y si quieres que sea automatizado... Puedes poner el código en un Timer

Saludos!
Responder Con Cita
  #4  
Antiguo 13-07-2010
xjre xjre is offline
Miembro
 
Registrado: feb 2008
Posts: 13
Poder: 0
xjre Va por buen camino
Gracias por ambas respuestas.

Esos dos metodos ya los encontre buscando por el foro y google, pasa que justamente lo que yo queria evitar en lo posible era el uso permanente de un timer que pregunte a cada rato si se esta ejecutando X programa, y ver en cambio si habia alguna forma de recibir algun mensaje que windows envie o algo similar, que indique que ese programa acaba de ser ejecutado.

Buscando mas por internet se me ocurrio una forma híbrida, utilizando el mensaje WM_ACTIVATEAPP de la WindowsApi, activando un TTimer en el momento en el que detecto que mi aplicacion dejo de tener el foco del SO y desactivandlo cuando vuelve a tenerlo. TTimer que por dentro tiene un proceso utilizando el EnumWindows y un procedimiento CallBack. Si tiene éxito lo posteo.

Sin embargo, si alguien sabe/conoce alguna forma de saber lo que especifique en un principio, quedaria agradecido.

Saludos
Responder Con Cita
  #5  
Antiguo 14-07-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Pues hasta donde yo se, no puedes hacerlo sin un Timer. El mismo Task Manager utiliza un Timer para actualizarse.

La única forma que se me ocurre es haciendo un Hook a la API CreateProcessW a nivel global, es decir inyectándote en todos los procesos capaces de lanzar otro porceso, es decir en todos...

Creo que es mas rentable un timer que se actualice cada segundo o medio segundo.

Saludos.
Responder Con Cita
  #6  
Antiguo 04-08-2010
genyus00 genyus00 is offline
Miembro
 
Registrado: jun 2010
Posts: 29
Poder: 0
genyus00 Va por buen camino
Talking

Uses un timer o un hilo, de igual forma tu aplicacion debe estar pendiente estilo sentinela a ver que mensages se generar y asi actuar de acuerdo al que programes detectar.
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
Registrar aplicación para recibir mensaje de reloj Lord Delfos API de Windows 8 04-02-2008 03:54:14
¿En cuantos lugares se escribe la direccion de un programa para ejecutarse? aeff Varios 10 15-10-2007 10:38:13
App emita Sonido al recibir mensaje netsend Gelmin Varios 1 19-07-2004 13:50:06
Programa que no pueda ejecutarse más de una vez Sr_Sombrero Varios 3 25-05-2004 16:21:11


La franja horaria es GMT +2. Ahora son las 14:33:19.


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