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 05-04-2006
DanForever DanForever is offline
Miembro
 
Registrado: may 2005
Posts: 13
Poder: 0
DanForever Va por buen camino
Question Detectar nuevos procesos en windows

En la situacion de ke mi aplicacion está minimizada, y el usuario inicia una , ¿como puedo hacer para detectar cuándo se ha iniciado el proceso, y saber qué proceso es el que se ha iniciado?
Responder Con Cita
  #2  
Antiguo 05-04-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Puedes encontrar (haz una búsqueda en los foros) el código para obtener la lista de procesos que hay en marcha; Es cuestión de ir tomando esa lista cada cierto tiempo y mirando las diferencias.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 05-04-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Hola,

puedes crear una captura con los procesos activos en un intervalo de tiempo (p.ej cada minuto), obtienes una lista con los procesos abiertos, al minutos, haces una segunda captura de los procesos activos y comparas las dos listas, podrás saber si hay procesos nuevos o procesos terminados.

Función para obtenerlos procesos activos

Añade 'TLHelp32' en el uses de tu form
Pon una TListBox (ListBox1) y un TButton (Button1) en tu form
Pon este código en el OnClick de Button1:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);

     function SacaExe(MangoW:HWND):string;
     {Obtiene el EXE de una tarea}
     {get EXE of a task}
     var
       Datos    :TProcessEntry32;
       hID       : DWord;
       Snap    : Integer;
     begin
       GetWindowThreadProcessId(MangoW,@hID);
       Snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
       try
         Datos.dwSize:=SizeOf(Datos);
         if(Process32First(Snap,Datos))then
         begin
           repeat
             if Datos.th32ProcessID=hID then
             begin
               Result:=StrPas(Datos.szExeFile);
               Break;
             end;
           until not(Process32Next(Snap,Datos));
         end;
       finally
         Windows.CloseHandle(Snap);
       end;
     end;


    function ObtieneVentanas(Mango: HWND;
             Nada: Pointer): Boolean; stdcall;
    var
       sTemp:string;
    begin
      Result := True;
      {Mango es el handle de la tarea encontrada}
      {Añadimos el .EXE si no está ya añadido...}
      sTemp:=SacaExe(Mango);
       with Form1.ListBox1.Items do
         if IndexOf(sTemp) = - 1 then Add(sTemp);
    end;

 begin
   EnumWindows( @ObtieneVentanas, 0 );
 end;

Espero te sirva de ayuda.

Saludos
Responder Con Cita
  #4  
Antiguo 07-04-2006
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,

Los Servicios de Windows son un mundo entero. En la ayuda que acompaña a Delphi, el SDK de Wind32 describe las diferentes funciones para tratar con ellos. Pero, nosotros también contamos con la librería Jedi JCL, no confundir con la Jedi VCL. En la Jedi JCL hay no pocas unidades que pueden sernos útiles en un momento dado, y, entre otras, se encuentra la unidad "JclSvcCtrl.pas", la cual hace uso de las funciones de la API de Windows para trabajar con sus Servicios, e incluso, yendo más allá, cuenta con clases para tratar a los Servicios como si de objetos se trataran.

Por ejemplo, el siguiente código está adaptado (robado, debía decir, o poco menos) de la mencionada unidad de la Jedi JCL, y, como se ve, con el mismo conocermos todos los Servicios conque Windows cuente. De todos modos el código no valdrá de nada si no se comprende (ni tampoco se podrá ir más allá o más acá del mismo), y, como digo, si se tiene interés en esto último, a darse una vuelta por el SDK de Win32 y por la unidad "JclSvcCtrl.pas" de la Jedi JCL, para empezar a abrir boca. He dicho.

Código Delphi [-]
uses
  Dialogs, WinSvc;

procedure TfrmPrincipal.Button1Click(Sender: TObject);
var
  i: integer;
  continuar: boolean;
  cbBufSize: Pointer;
  lpServices: PEnumServiceStatus;
  hSCManager, pcbBytesNeeded, lpServicesReturned, lpResumeHandle: DWORD;
begin
  hSCManager := OpenSCManager('', nil, SC_MANAGER_ENUMERATE_SERVICE);
  if (hSCManager <> 0) then
  begin
    lpResumeHandle := 0; // Esta variable ha de inicializarse a cero
    try
      cbBufSize := nil;
      pcbBytesNeeded := SizeOf(lpServices);
      repeat
        ReallocMem(cbBufSize, pcbBytesNeeded);
        continuar := EnumServicesStatus(hSCManager, SERVICE_TYPE_ALL, SERVICE_STATE_ALL,
                       PEnumServiceStatus(cbBufSize)^, pcbBytesNeeded, pcbBytesNeeded,
                         lpServicesReturned, lpResumeHandle);
      until continuar or (GetLastError <> ERROR_MORE_DATA);

      lpServices := cbBufSize;
      for i := 0 to lpServicesReturned - 1 do
      begin
        { Lo siguiente ya a nuestra disposición aquí

          lpServices^.lpServiceName
          lpServices^.lpDisplayName
          lpServices^.ServiceStatus.dwServiceType
          lpServices^.ServiceStatus.dwCurrentState
          lpServices^.ServiceStatus.dwControlsAccepted
          lpServices^.ServiceStatus.dwWin32ExitCode
          lpServices^.ServiceStatus.dwServiceSpecificExitCode
          lpServices^.ServiceStatus.dwCheckPoint
          lpServices^.ServiceStatus.dwWaitHint
        }
        Inc(lpServices);
      end;
    finally
      FreeMem(cbBufSize);
    end;
  end;
end;
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 07-04-2006 a las 23:37:01.
Responder Con Cita
  #5  
Antiguo 24-04-2006
DanForever DanForever is offline
Miembro
 
Registrado: may 2005
Posts: 13
Poder: 0
DanForever Va por buen camino
Smile Gracias

Gracias por vuestra ayuda! Me habeis dado la ayuda que necesitaba, aunque... ¿qué intervalo podría poner en el timer, para que parezca casi un evento más de la aplicación (que se ejecutara casi al instante de abrir otra aplicación)?

Última edición por DanForever fecha: 03-05-2006 a las 10:21:23.
Responder Con Cita
  #6  
Antiguo 02-10-2006
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,

Esto quedó sin respuesta en su momento y tú tampoco pareces haber ahondado en ello:

Cita:
Empezado por DanForever
¿qué intervalo podría poner en el timer, para que parezca casi un evento más de la aplicación (que se ejecutara casi al instante de abrir otra aplicación)?
Yo creo que es cuestión de que hagas unas pruebas... supongo que con un intervalo de 100 ó 200 milisegundos ya sería más que suficiente.
__________________
David Esperalta
www.decsoftutils.com
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
Bill Gates muestra nuevos detalles de Windows Vista Sasuke_Cub Noticias 2 07-01-2006 20:37:00
detectar que windows tienes. REHome OOP 2 04-10-2005 09:50:48
Acceso a los procesos de windows jymy788 Varios 3 31-08-2005 15:01:11
Ver procesos de windows darkpale API de Windows 2 19-10-2004 10:37:12
Acceso a los procesos de windows jymy788 Varios 6 27-09-2004 20:14:25


La franja horaria es GMT +2. Ahora son las 19:20:29.


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