Help and Support
 

powered byLive Search

Come utilizzare Visual C++ per chiudere un'altra applicazione

Identificativo articolo:307395
Ultima modifica:mercoledì 4 gennaio 2006
Revisione:3.0
Su questa pagina

Sommario

In questo articolo si descrive come chiudere un'altra applicazione all'interno dell'applicazione. Descrive inoltre come chiudere un'istanza specifica di un'altra applicazione quale Blocco note se più un'istanza dell'applicazione è nell'esecuzione.

Torna all'inizio

Dichiarare le variabili

È necessario definire le variabili diverse. Perché queste variabili sono utilizzate in più metodi, definirli una procedura cosicché esse si restino nell'ambito.

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

Torna all'inizio

Ottenere un elenco di istanze di applicazion

Il seguente codice per la funzione BuildList si chiama ogni volta che si crea una nuova istanza di Blocco note. Questo esempio memorizza le informazioni sui processi in un controllo ListView. Il codice che compila il controllo ListView è incluso solo di coerenza con l'esempio completo che si segue.

La parte più importante di questo codice è la chiamata al metodo GetProcessByName della classe Processo. Questo metodo restituisce una matrice di puntatori di oggetto Process che si possono iterare over by 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());
}

Torna all'inizio

Chiudere una specifica istanza di un'applicazion

Quando si dispone di più di applicazione nell'esecuzione istanze se si desidera chiudere un'istanza, si deve distinguere tra quei processi. In questo esempio si utilizza la proprietà Id per distinguere tra i processi. La proprietà Id e la proprietà MainWindowTitle si memorizzano nel controllo ListView.

Questo codice ottiene l'elemento che si seleziona correntemente nel controllo ListView, che ottiene un riferimento al processo utilizzando il metodo GetProcessById della classe Processo e che quindi chiude quello processo chiamando il metodo CloseMainWindow. Notare impossibile ricreare l'elenco prima che il processo sia essere terminato completamente perché il metodo WaitForExit della classe Processo impedisce ciò.
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.");
}
				

Torna all'inizio

Chiudere tutte le istanze di un'applicazion

Per chiudere tutte le istanze di un'applicazione particolare, camminare la matrice che restituisce il metodo GetProcessByName e quindi chiamare il metodo CloseMainWindow per ogni oggetto di processo.
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.");
}
				

Torna all'inizio

Procedura di esempi

1. Creare una nuova Applicazione C++ gestita in Microsoft Visual Studio .NET o Microsoft Visual Studio 2005. Attenere a questa seguente procedura a eseguire l'operazione:
a. Avviare Visual Studio .NET o Visual Studio 2005.
b. Dal menu File, scegliere Nuovo e quindi scegliere Project.
c. Quindi scegliere Visual C++ in Tipi progetto, nella finestra di dialogo Nuovo progetto, selezionare Applicazione C++ gestita per Visual Studio .NET 2002, scegliere Console Application (.NET) nel caso di Visual Studio .NET 2003 o scegliere CLR Console Application per Visual Studio 2005 in Modelli.
d. Digitare un nome di file nella casella Nome.
2. In Esplora soluzioni, aprire il file di progetto cpp.
3.Sostituire il codice nella finestra di codice:
#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.Creare e quindi eseguire l'applicazione.
5. Fare clic su Start Notepad una o più volte.
6. Fare clic su un'istanza di Blocco note nella casella ListView e quindi scegliere Close Process. L'istanza selezionata di Blocco note verrà chiusa Fare clic su Close All Processes per chiudere tutte le istanze di Blocco note che sono nell'esecuzione è inoltre possibile.
Nota: Questo articolo utilizza la proprietà Id della classe Processo per distinguere fra le istanze dell'applicazione. La proprietà Id è buona per questa attività poiché tutto il processo ID è univoco. È possibile utilizzare la proprietà WindowHandle di un oggetto Processo per ottenere gli stessi risultati. Malgrado altre proprietà consentono, esse sono meno adatte per questa attività. Se non si conosce l'ID di processo o se si dispone dell'handle della finestra principale, è possibile anche utilizzare la proprietà MainWindowTitle per consentire di identificare l'istanza corretta. Poiché la proprietà MainWindowTitle può non essere univoca, tuttavia non si garantisce che si riferisce alla finestra corretta.

Torna all'inizio

Riferimenti

Per ulteriori informazioni, vedere la pagina "Classe Processo" del seguente sito Web Microsoft Developer Network ( MSDN ):
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)

Torna all'inizio


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

Torna all'inizio

Chiavi: 
kbhowto kbhowtomaster KB307395 KbMtit kbmt

Torna all'inizio

Traduzione automatica articoliIl 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/)

Torna all'inizio

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

 

Other Support Options

  • Need More Help?
    Contact a Support professional by Email, Online or Phone.
  • Customer Service
    For non-technical assistance with product purchases, subscriptions, online services, events, training courses, corporate sales, piracy issues, and more.
  • Newsgroups
    Pose a question to other users. Discussion groups and Forums about specific Microsoft products, technologies, and services.