Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Recibir mensaje al ejecutarse programa (https://www.clubdelphi.com/foros/showthread.php?t=68888)

xjre 13-07-2010 14:37:21

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

escafandra 13-07-2010 15:01:37

Revisa este hilo.

Saludos.

bosster_018 13-07-2010 21:52:05

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!

xjre 13-07-2010 22:29:42

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

escafandra 14-07-2010 01:26:06

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.

genyus00 04-08-2010 22:49:47

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.


La franja horaria es GMT +2. Ahora son las 21:56:45.

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