Ver Mensaje Individual
  #1  
Antiguo 29-06-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Reputación: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Detectar aplicaciones en ejecución

Detectar todas las aplicaciones que se estén ejecutando en Windows.

FindWindow te busca ventanas concretas que pueden ser una aplicación o no y lo mismo pasa con EnumWindows, que te busca todas las ventanas TopLevel, pero hay aplicaciones que pueden tener más de una y ciertamente las hay a montones que no tienen ninguna ventana asociada.

Para hacer eso, tienes que echar mano de las ToolHelp. La contrapartida es que esta táctica no te vale para NT.

Bueno, te pongo, un ejemplo de como se hace, hazte la idea que simplemente consta de un TListView con la propiedad ViewStyle puesta a vsReport, así de paso explicamos como un TListView puede servir para mostrar varias columnas.

Código Delphi [-]
var
  hSnapShot: THandle;
  Process: TProcessEntry32;
  lResult: Boolean;
  ListItem: TListItem;
begin
  hSnapShot := CreateToolHelp32SnapShot( TH32CS_SNAPPROCESS, 0 );
  if ( hSnapShot = -1 ) then
    ShowMessage( 'Error: ' + IntToStr( GetLastError ) );
  lResult := Process32First( hSnapShot, Process );
  while lResult do
  begin
    ListItem := ProcessLView.Items.Add;
    with ListItem, Process do
    begin
      Caption := ExtractFileName( szExeFile );
      SubItems.Add( Format( '%-8.8x', [th32ModuleID] ) );
      SubItems.Add( Format( '%-8.8x', [th32ProcessID] ) );
      SubItems.Add( szExeFile );
    end (*with*);
    lResult := Process32Next( hSnapShot, Process );
  end (*while*);
  CloseHandle( hSnapShot );

Donde obviamente ProcessLView es el componente TListView al que hacía referencia.

Su uso es muy simple, como en un entorno donde el propio OS está creando y destruyendo procesos constantemente no tiene mucho sentido de hablar de procesos existentes, lo primero que hacemos es tomar una instántanea (snapshot) del estado de Windows en ese mismo momento, y seguidamente nos limitamos a recorrer la lista enlazada de todos los procesos que había en el momento en que sacamos la instantanea mediante llamadas a Process32First y Process32Next, añadiendo cada proceso al TListView, finalmente cuando hemos acabado, cerramos la "máquina de fotos" y liberamos la memoria.
Responder Con Cita