elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [C#] Identificar cuando una aplicación externa es cerrada.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C#] Identificar cuando una aplicación externa es cerrada.  (Leído 5,922 veces)
HappyNewYear

Desconectado Desconectado

Mensajes: 5


Ver Perfil
[C#] Identificar cuando una aplicación externa es cerrada.
« en: 30 Abril 2010, 20:12 pm »

El título lo dice todo, ¿es posible? Si lo es, ¿podrían darme un ejemplo?


En línea

MANULOMM


Desconectado Desconectado

Mensajes: 559


Erepublik.com


Ver Perfil
Re: [C#] Identificar cuando una aplicación externa es cerrada.
« Respuesta #1 en: 2 Mayo 2010, 18:27 pm »

pues se que es posible saber los procesos que hay en memoria, lo que podrias hacer es mirar cada determinado tiempo que procesos hay en memoria y asi controlar cuales se abren y cuales se cierran.

Atentamente,

Juan Manuel Lombana
Microsoft Student Partner
Microsoft Certified Professional
Medellín - Colombia


En línea


Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: [C#] Identificar cuando una aplicación externa es cerrada.
« Respuesta #2 en: 2 Mayo 2010, 20:33 pm »

Hace tiempo hice esta clase para capturar los procesos abiertos, capturar los cerrados es casi la misma idea, pero está en Vb.Net:
Código
  1. Public Class ProcessEvent
  2.  
  3.    Private _Begin As New Process, _
  4.               _CProcess As Integer = Process.GetProcesses.Count
  5.  
  6.    Private WithEvents lTimer As New Timer With {.Enabled = False, .Interval = 100}
  7.  
  8.    Public Event BeginProcess(ByVal e As Process)
  9.  
  10.    Private Function LastProcess() As Process
  11.        Dim Far As Integer = 0, _
  12.        VeryFar As Integer = 1
  13.        LastProcess = New Process
  14.  
  15.        For Each lProcess As Process In Process.GetProcesses
  16.            Try
  17.                Far = DateDiff(DateInterval.Second, lProcess.StartTime, Now)
  18.                If VeryFar > Far Then
  19.                    VeryFar = Far
  20.                    LastProcess = lProcess
  21.                End If
  22.            Catch
  23.                Continue For
  24.            End Try
  25.        Next
  26.  
  27.    End Function
  28.  
  29.    Public Property Enabled() As Boolean
  30.        Get
  31.            Return lTimer.Enabled
  32.        End Get
  33.        Set(ByVal value As Boolean)
  34.            lTimer.Enabled = value
  35.        End Set
  36.    End Property
  37.  
  38.    Private Sub lTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lTimer.Tick
  39.        On Error Resume Next
  40.  
  41.        If (Process.GetProcesses.Count - _CProcess) > 0 Then
  42.            RaiseEvent BeginProcess(LastProcess)
  43.        End If
  44.  
  45.        _CProcess = Process.GetProcesses.Count
  46.  
  47.    End Sub
  48. End Class
« Última modificación: 2 Mayo 2010, 20:35 pm por Keyen Night » En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
Atrum

Desconectado Desconectado

Mensajes: 65



Ver Perfil WWW
Re: [C#] Identificar cuando una aplicación externa es cerrada.
« Respuesta #3 en: 3 Mayo 2010, 17:12 pm »

Una de las opciones es utilizar un timer para verificar el proceso cada determinado tiempo, yo personalmente lo haria haciendo uso del Process y generar un evento para cuando el programa termine,  todo esto dentro de un threadPool para verificar multiples procesos si es necesario, en este codigo solo utilizo la primera coincidencia de la matriz GetProcessByName, pero si haces un foreach y con el treadPool puedes verificar todos los procesos del mismo nombre y aplicar el "Monitor" a cada uno de ellos.

Espero te funcione correctamente (yo lo corri sin problemas ;-) ).

Solo tengo un form un textbox y un button, hay que agregar las referencias System.Threading y System.Diagnostics.

Código
  1. using System;
  2. using System.ComponentModel;
  3. using System.Windows.Forms;
  4. using System.Threading;
  5. using System.Diagnostics;
  6.  
  7. namespace WindowsFormsApplication1
  8. {
  9.    //Declaramos el delegado para nuestro evento
  10.    public delegate void ProccesClosed(string ProcName);
  11.  
  12.    public partial class Form1 : Form
  13.    {
  14.        //Declaro una variable global para el nombre del proceso
  15.        public string ProcName;
  16.  
  17.        //Declaro mi evento nuevo, verifica que el IDE te asocie el
  18.        //evento con el delegado (Aparece coloreado en azul claro)
  19.        //lo digo por que no se que hice mal que a mi no me lo asocio a la primera
  20.        public  event ProccesClosed  ProcClosed;
  21.  
  22.        public Form1()
  23.        {
  24.            InitializeComponent();
  25.            //Agregamos el handler del evento
  26.            this.ProcClosed += new ProccesClosed(ProcesoTerminado);
  27.        }
  28.  
  29.        //Aqui la funcion que cargaremos en el hilo(thread) para verificar
  30.        //Que el proceso termine, todos los parametros deben ser del tipo Object
  31.        public void VerificarProceso(object  NombreProceso)
  32.        {
  33.            //Declaro la matriz de procesos y la lleno con los procesos que
  34.            //tengan el nombre casteando mi objeto como string
  35.            Process[] Proc;
  36.            Proc = Process.GetProcessesByName((string)NombreProceso);
  37.            //Verificamos que exista al menos una coincidencia, si no
  38.            //obtendriamos exepcion de referencia nula
  39.            if (Proc.Length != 0)
  40.            {
  41.                //Solo verifico la primera coincidencia
  42.                Proc[0].WaitForExit();
  43.                //Verificamos que el evento contenga el handler
  44.                if (ProcClosed != null)
  45.                    //se desencadena el evento
  46.                    ProcClosed((string)NombreProceso);
  47.            }
  48.            else
  49.                //En caso de que no exista dicho proceso
  50.                MessageBox.Show("No existe el proceso " + (string)NombreProceso);
  51.  
  52.        }
  53.  
  54.        //Esta es la funcion que llama el evento ProcClosed
  55.        public void ProcesoTerminado(string NombreProcesso)
  56.        {
  57.            MessageBox.Show("Se ha terminado el proceso " + NombreProcesso);
  58.        }
  59.  
  60.        private void button1_Click(object sender, EventArgs e)
  61.        {
  62.            ProcName = textBox1.Text;
  63.            //Agregamos La funcion al ThreadPool, podemos agregar cuantas
  64.            //queramos monitoreando procesos distintos
  65.            ThreadPool.QueueUserWorkItem(VerificarProceso, ProcName );
  66.        }
  67.  
  68.    }
  69. }
  70.  

Solo bastaria ejecutar y colocar en el textbox el nombre de un proceso sin la extension, como por ejemplo "notepad" o "calc", y cada thread desencadenara el evento cuando termine el proceso.

Cualquier error haganmelo saber

Suerte
« Última modificación: 3 Mayo 2010, 17:16 pm por Xtriker » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Ayuda] Modificar aplicacion externa
Programación C/C++
.mokk. 1 2,290 Último mensaje 6 Febrero 2011, 22:32 pm
por Eternal Idol
Redireccionar descargas de una aplicación externa
Hacking
mrsnake 1 2,570 Último mensaje 28 Agosto 2011, 00:51 am
por Luna71c0
¿Ejecutar una aplicacion externa en memoria?
Java
Seritx 1 2,725 Último mensaje 15 Marzo 2012, 21:00 pm
por sapito169
[SOS!][Obtener información de una aplicación externa]
Android
WaRc3L 0 2,212 Último mensaje 13 Abril 2014, 02:18 am
por WaRc3L
Detectar cuando la bandeja del lector está abierta o cerrada
.NET (C#, VB.NET, ASP)
Meta 5 6,260 Último mensaje 19 Noviembre 2017, 03:06 am
por okik
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines