Newsgroup: it.comp.lang.delphi
Titolo: Controllare applicazioni in esecuzione...

Salve...
Dovrei sviluppare un'applicazione che, controllando i processi in
esecuzione, chiuda (inesorabilmente) quelli che non interessano la mia
applicazione....
Qualcuno saprebbe gentilmente fornirmi qualche indicazione?
Grazie sin da ora.
Massimo
max...@libero.it

Qualcuno saprebbe gentilmente fornirmi qualche indicazione?
Dipende sotto quale sistema e che tipo di applicazioni bisogna
controllare. In ogni caso, per questo genere di applicazioni
bisognerebbe valutare bene il problema, perche' si rischia di fare
casini.
-- 
Andrea Laforgia (ICQ# 87230455) ---------------------------
Non scrivetemi in privato, se non richiesto espressamente.
No replies in private e-mail, unless explicitly requested.
----------------------------------------------------------

 casini.
Dovrebbe girare sotto sotto Windows98 - WindowsMe.
Dovrei verificare i processi in esecuzione.
(Espempio se vengono lanciate stampe, se vengono aperti programmi o
applicazioni)
Sapere, in buona sostanza, quali applicazioni sono in uso dal pc in ogni
momento.
Consigli?
Eventuali modi per chiudere applicazioni che non interessino.
Grazie ancora per la cortese risposta.
Massimo
max...@libero.it

Eventuali modi per chiudere applicazioni che non interessino.
E' tutto fattibile in modo piu' o meno facile.
Nel primo caso puoi usare le funzioni di snapshot e di "process
walking" fornite col ToolHelp32 (a fine messaggio c'e' un mio
esempio). Per monitorare le operazioni che vengono eseguite, potresti
usare un hook system-wide di tipo CBT (guarda su
www.msdn.microsoft.com
 la documentazione relativa).
Per chiudere le applicazioni, tutto dipende da "come" sono fatte
queste applicazioni (CUI o GUI ? con finestre o senza ?).
Si puo' andare dal chiudere in modo pulito spedendo messaggi WM_CLOSE
o WM_SYSCOMMAND con SC_CLOSE alle finestre create dai thread
dell'applicazione sino all'estremo TerminateProcess per "killare" il
processo.
//
// 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.


Massimo,
forse non ho capito benissimo cosa vuoi fare.
Cmq se vuoi che un EXE di Delphi chiuda un altro EXE di Delphi,
l'istruzione e' questa:
var
   h:THandle;
begin
   h:=FindWindow('TSvrFrm',nil); 
   if h > 0 then
      PostMessage(h,WM_CLOSE,0,0);
end;
qui TSvrFrm e'  il nome della main form dell'EXE da chiudere (cioe'
tipicamente TForm1).
Non so a quali casini ti esponi in caso di omonomia delle main form
concorrenti. A scanso di pericoli, ti conviene rinominare ogni main
form con un nome univoco.
Ciao
Duilio

 processo.
Molto gentile davvero.
Grazie 1000....
Saresti anche cosě gentile da consigliarmi qualche buona lettura su questi
argomenti, o qualche documentazione su internet?
(oltre al link che mi hai dato chiaramente)
Grazie davvero...
Bye..
A presto
Massimo
max...@libero.it

 Cmq se vuoi che un EXE di Delphi chiuda un altro EXE di Delphi,
Devo fare un programma.
Questo programma "limita" il pc a certe funzioni.
Se qualche altro programma viene lanciato (esempio Internet Explorer o
Calcolatrice o quello che sia) il programma se ne accorge e lo "uccide"
Di modo che sia io a stabilire quali programmi, e in quali momenti, questi
possano essere usati.
Grazie per la tua risposta.
Massimo

argomenti, o qualche documentazione su internet?
In realta', su MSDN c'e' quasi tutto quello che ti serve.


Calcolatrice o quello che sia) il programma se ne accorge e lo "uccide"
Massimo,
come temevo, il problema e' piu' complesso. Personalmente non ho mai
dovuto affrontare una cosa simile, ma in email ti invio un programmino
sorgente e freeware che avevo messo  da parte per studiarlo con
calma...solo che il momento di calma non c'e' piu' stato :)
Questo dovrebbe aiutarti. Nel caso, puoi sempre rivolgerti all'autore,
che sicuramente conosce la risposta.
Ciao
Duilio

dovuto affrontare una cosa simile
E secondo me non e' una cosa che dovrebbe essere affrontata.
Nel senso che, secondo me, questo genere di limiti si impone seguendo
altre strade, quanto piu' possibile standard, ovvero quanto piu'
possibile gestite dal sistema operativo (limitazione degli accessi per
un particolare utente a determinate "porzioni" del sistema, ecc...).
Non e' molto sicuro uccidere processi ormai lanciati. Sarebbe meglio
che l'utente non avesse i diritti per lanciare una particolare
applicazione. 
Ops... dimenticavo che parliamo di Windows...
