Identificativo articolo: 307395 - Ultima modifica: mercoledì 4 gennaio 2006 - Revisione: 3.0

L'utilizzo di Visual c ++ per chiudere un'altra applicazione

In questa pagina

Espandi tutto | Chiudi tutto

Sommario

In questo articolo viene descritto come chiudere un'altra applicazione da all'interno dell'applicazione. In questo articolo viene descritto come chiudere una specifica istanza di un'altra applicazione, ad esempio Blocco note, anche se sono in esecuzione più istanze dell'applicazione.

Dichiarare variabili

È necessario definire diverse variabili. Poiché queste variabili vengono utilizzate in più metodi, definirli all'esterno di qualsiasi routine in modo che rimangano nell'ambito.

Alla prima variabile è una matrice per contenere gli oggetti processo che restituisce il metodo GetProcessByName . In questo codice, "procName" è una variabile String utilizzato per contenere il nome del processo:
private:
   Process *processes[];
   static String *procName = S"Notepad";

Ottenere un elenco di istanze di applicazione

Il seguente codice per la funzione BuildList viene chiamato ogni volta che viene creata una nuova istanza del blocco note. Questo esempio viene memorizzato le informazioni sul processo in un controllo ListView . Il codice per popolare il controllo ListView è incluso solo per uniformità con l'esempio completo che segue.

La parte più importante di questo codice è la chiamata al metodo GetProcessByName della classe Process . Questo metodo restituisce una matrice di puntatori all'oggetto processo, che può essere scorse su utilizzando un ciclo for .
ListViewItem *itemAdd ; 
ListView1->Items->Clear();
processes = Process::GetProcessesByName(procName);
for (int i = 0; i < processes->Length; i++)
{
   itemAdd = ListView1->Items->Add(processes[i]->MainWindowTitle);
   itemAdd->SubItems->Add(processes[i]->Id.ToString());
}

Chiudere una specifica istanza di un'applicazione

Dopo avere più istanze di un'applicazione in esecuzione, se si desidera chiudere un'istanza, è necessario differenziare tali processi. In questo esempio viene utilizzata la proprietà di ID per distinguere tra i processi. La proprietà ID e la proprietà MainWindowTitle vengono archiviati nel controllo ListView .

Questo codice ottiene l'elemento correntemente selezionato nel controllo ListView , ottenuto un riferimento al processo utilizzando il metodo GetProcessById della classe Process e quindi si chiude tale processo chiamando il metodo CloseMainWindow . Nota che non è possibile ricostruire l'elenco prima che il processo è completamente terminato poiché il metodo di WaitForExit della classe Process impedisce questo.
try
{         
   ListViewItem *lvi = ListView1->SelectedItems->get_Item(0);
   ListViewItem::ListViewSubItem *lvsi = lvi->SubItems->get_Item(1);
   int procID = System::Convert::ToInt32(lvsi->Text);
   Process *tempProc=Process::GetProcessById(procID);
   tempProc->CloseMainWindow();
   tempProc->WaitForExit();
   BuildList();
}
catch(...)
{
   MessageBox::Show(S"Select a process in the ListView.");
}
				

Chiudere tutte le istanze di un'applicazione

Scorrere la matrice che restituisce il metodo GetProcessByName per chiudere tutte le istanze di una particolare applicazione e chiamare il metodo CloseMainWindow per ogni oggetto processo. Provare a
try
{
   for (int i = 0; i < processes->Length; i++)
   {
      processes[i]->CloseMainWindow();
   }

   ListView1->Items->Clear();
}
catch (System::NullReferenceException *)
{
   MessageBox::Show("No instances of Notepad running.");
}
				

Procedura di esempio

  1. Creare una nuova applicazione di c ++ di gestite in Microsoft Visual Studio .NET o Microsoft Visual Studio 2005. Per effettuare questa operazione, attenersi alla seguente procedura:
    1. Avviare Visual Studio .NET o Visual Studio 2005.
    2. Scegliere Nuovo dal menu file , quindi progetto .
    3. Nella finestra di dialogo Nuovo progetto , fare clic su Progetti di Visual c ++ in Tipi progetto e quindi fare clic su Applicazione c ++ gestita per Visual Studio .NET 2002, fare clic su Applicazione Console (. NET) per Visual Studio .NET 2003 o fare clic su Applicazione Console CLR per Visual Studio 2005 in modelli .
    4. Digitare un nome file nella casella nome della casella.
  2. In Esplora soluzioni aprire il file cpp del progetto.
  3. Replace the code in the Code window with the following:
    #include "stdafx.h"
    #include <windows.h>
    #ifdef MessageBox
    #undef MessageBox
    #endif
    
    #using <mscorlib.dll>
    #using "System.Dll"
    #using "System.Windows.Forms.Dll"
    #using "System.Drawing.Dll"
    
    using namespace System;
    using namespace System::Drawing;
    using namespace System::Collections;
    using namespace System::ComponentModel;
    using namespace System::Windows::Forms;
    using namespace System::Diagnostics;
    
    namespace CloseApplication_mc
    {
       public __gc class Form1 : public Form
       {
       protected:
          Button *btnCloseAll;
          ColumnHeader *ColumnHeader2;
          ColumnHeader *ColumnHeader1;
          Button *btnLaunch1;
          ListView *ListView1;
          Button *btnClose1;
    
       private:
          Process *processes[];
          static String *procName = S"Notepad";
          static String *specialFolder = Environment::GetFolderPath(Environment::SpecialFolder::System);
    
       public:
          Form1()
          {
             InitForm();
          }
    
       protected:
          void Dispose( bool disposing )
          {
             Form::Dispose(disposing);
          }
    
       private:
          void InitForm()
          {
             btnClose1 = new Button();
             ColumnHeader2 = new ColumnHeader();
             ColumnHeader1 = new ColumnHeader();
             btnCloseAll = new Button();
             btnLaunch1 = new Button();
             ListView1 = new ListView();
             SuspendLayout();
    
             // 
             // btnClose1
             // 
             btnClose1->Location = Point(160, 176);
             btnClose1->Name = S"btnClose1";
             btnClose1->Size = System::Drawing::Size(112, 32);
             btnClose1->TabIndex = 4;
             btnClose1->Text = S"Close Selected Process";
             btnClose1->Click += new System::EventHandler(this, btnClose1_Click);
             Controls->Add(btnClose1);
    
             // 
             // btnCloseAll
             // 
             btnCloseAll->Location = Point(160, 216);
             btnCloseAll->Name = S"btnCloseAll";
             btnCloseAll->Size = System::Drawing::Size(112, 32);
             btnCloseAll->TabIndex = 3;
             btnCloseAll->Text = S"Close All Processes";
             btnCloseAll->Click += new System::EventHandler(this, btnCloseAll_Click);
             Controls->Add(btnCloseAll);
    
             // 
             // btnLaunch1
             // 
             btnLaunch1->Location = Point(32, 176);
             btnLaunch1->Name = S"btnLaunch1";
             btnLaunch1->Size = System::Drawing::Size(112, 72);
             btnLaunch1->TabIndex = 1;
             btnLaunch1->Text = S"Start Notepad";
             btnLaunch1->Click += new System::EventHandler(this, btnLaunch1_Click);
             Controls->Add(btnLaunch1);
    
             // 
             // ColumnHeader2
             // 
             ColumnHeader2->Text = S"Process ID";
             ColumnHeader2->Width = 85;
    
             // 
             // ColumnHeader1
             // 
             ColumnHeader1->Text = S"Window Title";
             ColumnHeader1->Width = 160;
    
             // 
             // ListView1
             // 
             ListView1->Columns->Add(ColumnHeader1);
             ListView1->Columns->Add(ColumnHeader2);
             ListView1->Location = Point(22, 8);
             ListView1->MultiSelect = false;
             ListView1->Name = S"ListView1";
             ListView1->Size = System::Drawing::Size(250, 152);
             ListView1->TabIndex = 7;
             ListView1->View = View::Details;
             Controls->Add(ListView1);
    
             // 
             // Form1
             // 
             AutoScaleBaseSize = System::Drawing::Size(5, 13);
             ClientSize = System::Drawing::Size(292, 266);
             Name = S"Form1";
             Text = S"Process Example";
             Closing += new System::ComponentModel::CancelEventHandler(this, closing);
             Load += new System::EventHandler(this, Form1_Load);
             ResumeLayout(false);
          }
    
          void BuildList()
          {
             ListViewItem *itemAdd ; 
             ListView1->Items->Clear();
             processes = Process::GetProcessesByName(procName);
             for (int i = 0; i < processes->Length; i++)
             {
                itemAdd = ListView1->Items->Add(processes[i]->MainWindowTitle);
                itemAdd->SubItems->Add(processes[i]->Id.ToString());
             }
          }
    
          void btnLaunch1_Click(Object *sender, EventArgs *e)
          {
             ProcessStartInfo *p = new ProcessStartInfo();
             p->FileName = String::Concat(specialFolder, S"\\eula.txt");
             p->WindowStyle = ProcessWindowStyle::Minimized ;
             Process *proc = Process::Start(p);
             proc->WaitForInputIdle();
             BuildList();
          }
    
          void Form1_Load(Object *sender, EventArgs *e)
          {
          }
    
          void btnClose1_Click(Object *sender, EventArgs *e)
          {
             try
             {         
                ListViewItem *lvi = ListView1->SelectedItems->get_Item(0);
                ListViewItem::ListViewSubItem *lvsi = lvi->SubItems->get_Item(1);
                int procID = System::Convert::ToInt32(lvsi->Text);
                Process *tempProc=Process::GetProcessById(procID);
                tempProc->CloseMainWindow();
                tempProc->WaitForExit();
                BuildList();
             }
             catch(...)
             {
                MessageBox::Show(S"Select a process in the ListView before clicking this button.");
             }
          }
    
          void btnCloseAll_Click(Object *sender, EventArgs *e)
          {
             if (processes != 0)
             {
                for (int i = 0; i < processes->Length; i++)
                {
                   processes[i]->CloseMainWindow();
                }
           
                ListView1->Items->Clear();
             }
          }
    
          void closing(Object *sender, System::ComponentModel::CancelEventArgs *e)
          {
             btnCloseAll_Click(this,e);
          }
       };
    } 
    
    using namespace CloseApplication_mc;
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
       Form1 *FormInstance = new Form1;
       Application::Run(FormInstance);
    
       return 0;
    }
    					
  4. Generare ed eseguire quindi l'applicazione.
  5. Fare clic su Start blocco di note una o più volte.
  6. Fare clic su un'istanza del blocco note nella casella di controllo ListView e quindi scegliere Chiudi processo . L'istanza selezionata di Blocco note verrà chiusa. È inoltre possibile fare clic su Chiudi tutti i processi per chiudere tutte le istanze di blocco note in esecuzione.
Nota In questo articolo utilizzata la proprietà di ID della classe Process per distinguere le istanze dell'applicazione. La proprietà di ID è ideale per questa attività, dal momento che tutti gli ID di processo sono univoci. È possibile utilizzare proprietà WindowHandle di un oggetto processo per ottenere i risultati stessi. Sebbene sia possibile utilizzare altre proprietà, sono meno adatti per questa attività. Se non si conosce l'ID di processo o se si dispone di handle della finestra principale, è possibile utilizzare la proprietà MainWindowTitle per identificare l'istanza corretta. Poiché la proprietà MainWindowTitle potrebbe non essere univoca, è tuttavia non garantisce che ci si riferisce alla finestra corretta.

Riferimenti

Per ulteriori informazioni, vedere la pagina di "Process Class" sul seguente sito Web MSDN (informazioni in lingua inglese):
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDiagnosticsProcessClassTopic.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDiagnosticsProcessClassTopic.asp)


Le informazioni in questo articolo si applicano a:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
Chiavi: 
kbmt kbhowtomaster kbhowto KB307395 KbMtit
Traduzione automatica articoliTraduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 307395  (http://support.microsoft.com/kb/307395/en-us/ )
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.
 

Traduzione articoli