PDA

Ver la Versión Completa : Identificador de programas en ejecución


Josue
20-12-2006, 17:03:46
Saludos a todos

Tengo una duda, quisiera saber si existe un evento o algo parecido que me pueda informar el momento en que se ejecuta un programa o es cerrado, esto debido a que quisiera hacer un control de todos los programas que se ejecutan en la computadora

La única manera que he encontrado es con un timer, pero el problema es que si un programa se ejecuta y es cerrado antes de que el timer se vuelva a activar el programa no se da cuenta.

Gracias a todos de antemano

Neftali [Germán.Estévez]
20-12-2006, 17:30:10
Puedes colocar un refresco del timer suficientemente pequeño para que detecte el cambio.
Piensa que así se hace en aplicaciones que listan los procesos tipo ProcessMonitor (http://www.microsoft.com/technet/sysinternals/ProcessesAndThreads/processmonitor.mspx), ProcessExplorer (http://www.microsoft.com/technet/sysinternals/ProcessesAndThreads/ProcessExplorer.mspx), TaskInfo,....
Incluso en muchas de ellas se configura la exploración cada x segundos.

Si no recuerdo mal, en los trucos del club hay uno para mostrar los procesos activos; Es cuestión de evaluar la lista de procesos cada intervalo y ver las diferencias.

seoane
20-12-2006, 17:46:38
Estoy de acuerdo con neftali, si la idea es monitorizar los procesos, un proceso que empiece y termine en menos de medio segundo segundo (un intervalo muy aceptable para el timer del que hablábamos), o es una aplicación extraña o por lo menos con un funcionamiento atípico. La única razón que se me ocurre para necesitar detectar este tipo de aplicaciones fugaces es por motivos de seguridad, pero en ese caso, incluso si pudiéramos detectar su ejecución ¿que haríamos para protegernos? :confused:

Otra cosa, son las aplicaciones tipo "antivirus". Estas emplean toda una serie de "técnicas" para detectar, y en su caso bloquear la ejecución de un programa. Estas técnicas van desde crear drivers que actúan al nivel del kernel, hasta "parchear" las funciones CreateProcessA y CreateProcessW.

Si te sirve, hay un pequeño truco para detectar la ejecución de una aplicación, pero esta tiene que usar ventanas o al menos usar la librería user32.dll. Lo malo es que las aplicaciones de consola no usan esta librería, por lo tanto no las detectaríamos :(

Josue
20-12-2006, 18:03:03
Gracias.

Lo había pensado así, con el tiempo de un timer muy pequeño, pero tengo la duda de que esto pueda hacer que la computadora ocupe recursos de mas, como en el caso de los antivirus que hace que se alente el sistema.

El objetivo de este programa es verificar cuales son los programas mas usados, no tanto para impedir la ejecución de estos.

Gracias por su ayuda

seoane
20-12-2006, 18:11:40
Lo había pensado así, con el tiempo de un timer muy pequeño, pero tengo la duda de que esto pueda hacer que la computadora ocupe recursos de mas, como en el caso de los antivirus que hace que se alente el sistema.

El objetivo de este programa es verificar cuales son los programas mas usados, no tanto para impedir la ejecución de estos.


Pues entonces no te preocupes. Yo he hecho programas similares con intervalos de hasta 200 milisegundos y no consumen apenas recursos. Puedes hacer la prueba, crea tu programa y comprueba en el administrador de tareas el uso de la CPU.

Los antivirus ralentizan el sistema no por que usen timers, todo lo contrario, lo ralentizan porque interceptan y analizan cada una de la funciones del sistema, como CreateProccess, y en momentos determinados se ven sobrepasados de trabajo.

fide
31-12-2006, 21:15:51
Ha, eso que tratas de hacer tiene muchas maneras de conseguirse. Una de ellas puede hacerse de la siguiente manera.

1 -- Al ejecutar tu aplicación, crear una lista en memoria de todos los procesos en ejecución.

2 – Siempre que un proceso se cierre y se ejecute nuevamente incrementas un contador para ese proceso y así sabrás cuantas veces se ejecutó.

Te recomiendo crear un record con

Nombre_de_App : String;
Cantidad_de_Ejecuciones : Integer;

A, el trucomania tiene algo que te puede servir.

Chao...

fide
31-12-2006, 21:15:51
Ha, eso que tratas de hacer tiene muchas maneras de conseguirse. Una de ellas puede hacerse de la siguiente manera.

1 -- Al ejecutar tu aplicación, crear una lista en memoria de todos los procesos en ejecución.

2 – Siempre que un proceso se cierre y se ejecute nuevamente incrementas un contador para ese proceso y así sabrás cuantas veces se ejecutó.

Te recomiendo crear un record con

Nombre_de_App : String;
Cantidad_de_Ejecuciones : Integer;

A, el trucomania tiene algo que te puede servir.

Chao...