Help and Support

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

Come utilizzare 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 più di un'istanza dell'applicazione è in esecuzione.

Dichiarare variabili

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

La prima variabile è una matrice per contenere gli oggetti processo che il metodo GetProcessByName restituisce. In questo codice "procname" è una variabile stringa che viene utilizzata 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 di 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 iterazione su, utilizzare 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 distinguere tra tali processi. In questo esempio viene utilizzata la proprietà ID per distinguere i processi. La proprietà ID e la proprietà MainWindowTitle vengono memorizzati nel controllo ListView .

Il codice ottiene l'elemento è attualmente selezionato nel controllo ListView , viene ottenuto un riferimento al processo utilizzando il metodo GetProcessById della classe Process e lo chiude tale processo chiamando il metodo CloseMainWindow . Si noti che è Impossibile ricostruire l'elenco prima che il processo è terminato completamente perché il metodo WaitForExit della classe Process impedisce questa.
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

Per chiudere tutte le istanze di una determinata applicazione, esaminare la matrice che il metodo GetProcessByName restituisce e quindi chiamare il metodo CloseMainWindow per ogni oggetto processo. try
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 c ++ gestito in Visual Studio .NET o Visual Studio 2005. A tale scopo, 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 di progetto , quindi fare clic su Applicazione c ++ gestita per Visual Studio .NET 2002, fare clic su .NET (console Application) per Visual Studio .NET 2003 oppure fare clic su Applicazione console CLR per Visual Studio 2005 in modelli .
    4. Digitare un nome file nella casella Nome casella.
  2. In Esplora soluzioni, aprire il file di 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 Avvia il blocco note uno o più volte.
  6. Fare clic su un'istanza di Blocco note nella casella di controllo ListView e quindi fare clic su processo di chiusura . L'istanza selezionata di Blocco note verrà chiusa. È inoltre possibile fare clic su Chiudi tutti I processi per chiudere tutte le istanze del Blocco note in esecuzione.
Nota In questo articolo utilizzata la proprietà ID della classe Process per distinguere istanze dell'applicazione. La proprietà ID è valida per questa attività perché tutti i processi ID sono univoci. È possibile utilizzare la proprietà WindowHandle di un oggetto processo per ottenere i risultati stessi. Sebbene sia possibile utilizzare altre proprietà, sono meno adatti a questa attività. Se non si conosce l'ID del processo o se si dispone dell'handle della finestra principale, è possibile utilizzare anche la proprietà di MainWindowTitle per identificare l'istanza corretto. Poiché la proprietà MainWindowTitle potrebbe non essere univoca, si non garantisce tuttavia che si fa riferimento alla finestra corretta.

Riferimenti

Per ulteriori informazioni, vedere la pagina classe di processo nel 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. Nel caso in cui si riscontrino degli errori e si desideri inviare dei suggerimenti, è possibile completare il questionario riportato alla fine del presente articolo.
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