Newsgroup: it.comp.lang.delphi
Titolo: Programma in esecuzione

Come faccio a sapere se programma č in esecuzione?
Grazie!

Come faccio a sapere se programma è in esecuzione?
Dipende dalle informazioni che possiedi su di esso ... in linea di massima
puoi comunque utilizzare le ToolHelp dell'API di Windows per stilare una
lista di processi attivi. Ti ricordo che le ToolHelp non ci sono su WinNT
(ci sono però le PSAPI...).
Per ulteriori informazioni : 
www.msdn.microsoft.com
Se vuoi un esempio chiedi pure...
Ciao!
--
- Carlo -

Come faccio a sapere se programma è in esecuzione?
Se conosci la caption della finestra principale o la sua classe, puoi
usare FindWindow o FindWindowEx.
Al limite puoi scorrere la lista dei processi e verificare la presenza
del nome di immagine del processo.
--
Andrea Laforgia (UIN 87230455)
----------------------------------------------------------
Non scrivetemi per e-mail, se non richiesto espressamente.
No replies in private e-mail, unless explicitly requested.
----------------------------------------------------------




Ti chiedo l'esempio...
Ecco un piccolo pezzo di codice....
Includi la unit TlHelp32
Procedure ProcessList ( PList : TStringList );
var
hSnapshot : THandle;
EProcess : TProcessEntry32;
IsNotLast : Boolean;
begin
hSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
If hSnapShot<>-1 then
   begin
     IsNotLast:=Process32First(hSnapShot,EProcess);
     While IsNotlast do
     begin
       PList.Add(EProcess.szExeFile);
       IsNotLast:=Process32Next(hSnapShot,EProcess);
     end;
   end;
CloseHandle(hSnapShot);
end;
Occhio che io non mappo l'oggetto TStringList in memoria (non si sa mai sia
stato dichiarato come variabile locale), quindi vedi di farlo tu prima di
richiamare la funzione. Essendo una TStringList potrai successivamente
assegnarlo a un componente a tuo piacere...
Ti faccio un piccolo esempio di utilizzo e assegnazione ad una Listbox :
Var Lista : TStringList;
begin
  Lista:=TStringList.Create;
  ProcessList(Lista);
  Listbox1.Items.Assign(Lista);
end;
Se vuoi realizzare qualcosa di simile su NT puoi utilizzare le PSAPI ...
altrimenti per ottenere un risultato simile (e sottolineo simile) puoi farlo
mediante una EnumWindows (che funziona sia su Win9x che su NT) con un
controllo sul process id del processo Owner della finestra ... diciamo che è
un'idea che mi è appena venuta in mente. Se ti interessa si può
sperimentare.


  Listbox1.Items.Assign(Lista);
Dimenticavo....ovviamente se non ne hai + bisogno libera memoria :
Lista.Free;
Ola!
--
- Carlo -

controllo sul process id del processo Owner della finestra ... 
I processi non sono "owner" di alcuna finestra.
La relazione "owner"/"owned" e' solo tra finestre e le finestre
vengono create/gestite/distrutte dai thread contenuti in un processo.
Preciso che questo tipo di controllo non e' sicuro in quanto possono
esistere processi senza finestre.
--------------------------------------------------------------------
//
// The following program lists all running processes.
// It works under Windows9x as well as WindowsNT 4.0+
//
program ProcList ;
{by Andrea Laforgia}
{$APPTYPE CONSOLE}
uses SysUtils, Windows, TLHelp32, Psapi, Classes ;
procedure CreateWin9xProcessList( List : TStringList ) ;
var hSnapShot : THandle ;
    ProcInfo  : TProcessEntry32 ;
begin
  if List = nil then Exit ;
  hSnapShot := CreateToolHelp32Snapshot( TH32CS_SNAPPROCESS, 0 ) ;
  if ( hSnapShot <> THandle(-1) ) then
  begin
    ProcInfo.dwSize := sizeof( ProcInfo ) ;
    if ( Process32First( hSnapshot, ProcInfo ) ) then
    begin
      List.Add( ProcInfo.szExeFile ) ;
      while ( Process32Next( hSnapShot, ProcInfo ) ) do
        List.Add( ProcInfo.szExeFile ) ;
    end ;
    CloseHandle( hSnapShot ) ;
  end ;
end ;
procedure CreateWinNTProcessList( List : TStringList ) ;
var PIDArray   : array [0..1023] of DWORD ;
    cb         : DWORD ;
    I          : integer ;
    ProcCount  : integer ;
    hMod       : HMODULE ;
    hProcess   : THandle ;
    ModuleName : array [0..300] of char ;
begin
  if List = nil then Exit ; 
  EnumProcesses( @PIDArray, sizeof( PIDArray ), cb ) ;
  ProcCount := cb div sizeof( DWORD ) ;
  for I := 0 to ProcCount-1 do
  begin
    hProcess := OpenProcess( PROCESS_QUERY_INFORMATION or
                             PROCESS_VM_READ,
                             false,
                             PIDArray[I] ) ;
    if ( hProcess <> 0 ) then
    begin
      EnumProcessModules( hProcess, @hMod, sizeof( hMod ), cb ) ;
      GetModuleBaseName( hProcess,
                         hMod, ModuleName, sizeof( ModuleName ) ) ;
      List.Add( ModuleName ) ;
      CloseHandle( hProcess ) ;
    end ;
  end ;
end ;
procedure GetProcessList( List : TStringList ) ;
var ovi : TOSVersionInfo ;
begin
  if List = nil then Exit ; 
  ovi.dwOSVersionInfoSize := sizeof( TOSVersionInfo ) ;
  GetVersionEx( ovi ) ;
  case ovi.dwPlatformId of
       VER_PLATFORM_WIN32_WINDOWS : CreateWin9xProcessList( List ) ;
       VER_PLATFORM_WIN32_NT      : CreateWinNTProcessList( List )  ;
  end
end ;
procedure WriteProcessList( L : TStringList ) ;
var I : integer ;
begin
  if L = nil then Exit ;
  for I := 0 to L.Count - 1 do
    writeln( L.Strings[I] ) ;
end ;
// main program
var MyProcList : TStringList ;
begin
  MyProcList := TStringList.Create;
  try
    GetProcessList( MyProcList ) ;
    WriteProcessList( MyProcList ) ;
  finally
    MyProcList.Free ;
  end;
  readln ;
end.


Se conosci la caption della finestra principale
Mi critichi quando la chiamo così e adesso....
o la sua classe, puoi usare FindWindow o FindWindowEx.
Se non vale la tecnica di EnumWindows vale tantomeno quella di
FindWindow...non tutti i processi hanno una finestra....
--
- Carlo -

FindWindow...non tutti i processi hanno una finestra....
Bertuccini, leggi bene i miei messaggi :
Io scrivo : "se conosci la classe della finestra..." e "al limite
scorri la lista dei processi...". 
Come vedi, sono coperti entrambi i casi.
--
Andrea Laforgia (ICQ 87230455)

...


E allora tu leggi bene i miei, dove prima parlo di lista di processi e, in
alternativa, di EnumWindows.
"altrimenti per ottenere un risultato simile (e sottolineo simile) puoi
farlo mediante una EnumWindows"
--
- Carlo -

E allora tu leggi bene i miei
Bertuccini, hai l'abilita' di dare vita ed alimentare polemiche,
nonostante tu sappia benissimo che quanto stai affermando e'
scorretto. Io non ho sottolineato QUEL passo del tuo messaggio, ma
quello in cui affermi che i processi sono owner delle finestre. 
Assicurati di sapere bene di cosa si sta parlando prima di rispondere
ed evita, per cortesia, di fomentare polemiche. Nessuno vuol far
passare gli altri per "deficienti", ho solo precisato una cosa
scorretta in un tuo messaggio. Non ne fare una tragedia, come al
solito.
--
Andrea Laforgia (ICQ 87230455)
------------------------------ 
#exclude <windows.h>

ed evita, per cortesia, di fomentare polemiche.
Stai implicitamente affermando che io non so quel che dico! Come sempre
offendi e poi neghi di farlo ... dai dillo "sfido chiunque a trovare
qualcosa di offensivo"
Nessuno vuol far passare gli altri per "deficienti",
Pensavo fosse il to scopo sui NG!
ho solo precisato una cosa scorretta in un tuo messaggio. Non ne fare una
tragedia, come al solito.
E io ne ho precisata una in uno tuo! Non dirmi che non avevi capito che
intendevo dire "Una finestra creata da uno dei thread del processo", allora
le cose sono 2 :
a - sei impedito
b - sei ipocrita
Scegli....
--
- Carlo -



ROTFL !
Che pena... non capisco per quale motivo ti avveleni il sangue a
questo modo... scusa tanto, ma sento proprio che e' arrivato il
momento di salutarti ;)


grazie da parte del ng,
Chiedo scusa a te e a tutto il NG, ma sembra che l'ultimo scopo del signor
Laforgia sia quello di essere costruttivo per il NG!
Vabbè, ciao!
--
- Carlo -

"Andrea Laforgia":
[snip]
| sento proprio che e' arrivato il
| momento di salutarti ;)
ecco, salutatevi...
vabbe' che qui non c'e' Cantu' che s'inca##a
(ti ricordi, Andrea??)
ma mi posso inca##are io,
... non lo faccio perche' non voglio
alimentare questo thread inutile.
Perpiacere smettetela,
grazie da parte del ng,
Alan