Application.Run Metoda

Definicja

Rozpoczyna uruchamianie standardowej pętli komunikatów aplikacji w bieżącym wątku.

Przeciążenia

Run()

Rozpoczyna uruchamianie standardowej pętli komunikatów aplikacji w bieżącym wątku bez formularza.

Run(ApplicationContext)

Rozpoczyna uruchamianie standardowej pętli komunikatów aplikacji w bieżącym wątku z elementem ApplicationContext.

Run(Form)

Rozpoczyna uruchamianie standardowej pętli komunikatów aplikacji w bieżącym wątku i sprawia, że określony formularz jest widoczny.

Run()

Rozpoczyna uruchamianie standardowej pętli komunikatów aplikacji w bieżącym wątku bez formularza.

public:
 static void Run();
public static void Run ();
static member Run : unit -> unit
Public Shared Sub Run ()

Wyjątki

Główna pętla komunikatów jest już uruchomiona w tym wątku.

Uwagi

W aplikacji opartej na systemie Win32 lub Windows Forms pętla komunikatów jest procedurą w kodzie, która przetwarza zdarzenia użytkownika, takie jak kliknięcia myszy i pociągnięcia klawiatury. Każda uruchomiona aplikacja oparta na systemie Windows wymaga aktywnej pętli komunikatów nazywanej główną pętlą komunikatów. Po zamknięciu pętli komunikatów głównych aplikacja kończy działanie. W Windows Forms ta pętla jest zamykana po Exit wywołaniu metody lub wywołaniu ExitThread metody w wątku, który uruchamia główną pętlę komunikatów.

Większość Windows Forms deweloperzy nie muszą używać tej wersji metody. Należy użyć Run(Form) przeciążenia, aby uruchomić aplikację z formularzem głównym, aby aplikacja została zakończona po zamknięciu formularza głównego. W przypadku wszystkich innych sytuacji należy użyć Run(ApplicationContext) przeciążenia, które obsługuje dostarczanie ApplicationContext obiektu w celu uzyskania lepszej kontroli nad okresem istnienia aplikacji.

Zobacz też

Dotyczy

Run(ApplicationContext)

Rozpoczyna uruchamianie standardowej pętli komunikatów aplikacji w bieżącym wątku z elementem ApplicationContext.

public:
 static void Run(System::Windows::Forms::ApplicationContext ^ context);
public static void Run (System.Windows.Forms.ApplicationContext context);
static member Run : System.Windows.Forms.ApplicationContext -> unit
Public Shared Sub Run (context As ApplicationContext)

Parametry

context
ApplicationContext

Element ApplicationContext , w którym jest uruchamiana aplikacja.

Wyjątki

Główna pętla komunikatów jest już uruchomiona w tym wątku.

Przykłady

W przykładzie są wyświetlane dwie formularze i zamykają aplikację po zamknięciu obu formularzy. Po uruchomieniu i zakończeniu działania aplikacji zostanie zapamiętana pozycja każdego formularza. W tym przykładzie pokazano, jak używać elementu ApplicationContext, wraz z Application.Run(context) metodą , aby wyświetlić wiele formularzy podczas uruchamiania aplikacji.

Klasa MyApplicationContext dziedziczy i ApplicationContext śledzi, kiedy każdy formularz jest zamknięty, i zamyka bieżący wątek, gdy są. Klasa przechowuje pozycje każdego formularza dla użytkownika. Dane położenia formularza są przechowywane w pliku o nazwie Appdata.txt , który jest tworzony w lokalizacji określonej przez UserAppDataPath. Metoda Main wywołuje metodę Application.Run(context) , aby uruchomić aplikację przy użyciu elementu ApplicationContext.

Kod formularzy AppForm1 i AppForm2 nie jest wyświetlany w celu zwięzłości. ApplicationContext Zobacz omówienie klasy, aby zapoznać się z całym listą kodu.

// The class that handles the creation of the application windows
ref class MyApplicationContext: public ApplicationContext
{
private:
   int _formCount;
   AppForm1^ _form1;
   AppForm2^ _form2;
   System::Drawing::Rectangle _form1Position;
   System::Drawing::Rectangle _form2Position;
   FileStream^ _userData;

public:

   MyApplicationContext()
   {
      _formCount = 0;
      
      // Handle the ApplicationExit event to know when the application is exiting.
      Application::ApplicationExit += gcnew EventHandler( this, &MyApplicationContext::OnApplicationExit );
      try
      {
         
         // Create a file that the application will store user specific data in.
         _userData = gcnew FileStream( String::Concat( Application::UserAppDataPath, "\\appdata.txt" ),FileMode::OpenOrCreate );
      }
      catch ( IOException^ e ) 
      {
         
         // Inform the user that an error occurred.
         MessageBox::Show( "An error occurred while attempting to show the application. The error is: {0}", dynamic_cast<String^>(e) );
         
         // Exit the current thread instead of showing the windows.
         ExitThread();
      }

      
      // Create both application forms and handle the Closed event
      // to know when both forms are closed.
      _form1 = gcnew AppForm1;
      _form1->Closed += gcnew EventHandler( this, &MyApplicationContext::OnFormClosed );
      _form1->Closing += gcnew CancelEventHandler( this, &MyApplicationContext::OnFormClosing );
      _formCount++;
      _form2 = gcnew AppForm2;
      _form2->Closed += gcnew EventHandler( this, &MyApplicationContext::OnFormClosed );
      _form2->Closing += gcnew CancelEventHandler( this, &MyApplicationContext::OnFormClosing );
      _formCount++;
      
      // Get the form positions based upon the user specific data.
      if ( ReadFormDataFromFile() )
      {
         
         // If the data was read from the file, set the form
         // positions manually.
         _form1->StartPosition = FormStartPosition::Manual;
         _form2->StartPosition = FormStartPosition::Manual;
         _form1->Bounds = _form1Position;
         _form2->Bounds = _form2Position;
      }

      
      // Show both forms.
      _form1->Show();
      _form2->Show();
   }

   void OnApplicationExit( Object^ /*sender*/, EventArgs^ /*e*/ )
   {
      
      // When the application is exiting, write the application data to the
      // user file and close it.
      WriteFormDataToFile();
      try
      {
         
         // Ignore any errors that might occur while closing the file handle.
         _userData->Close();
      }
      catch ( Exception^ ) 
      {
      }

   }

private:

   void OnFormClosing( Object^ sender, CancelEventArgs^ /*e*/ )
   {
      
      // When a form is closing, remember the form position so it
      // can be saved in the user data file.
      if ( dynamic_cast<AppForm1^>(sender) != nullptr )
            _form1Position = (dynamic_cast<Form^>(sender))->Bounds;
      else
      if ( dynamic_cast<AppForm1^>(sender) != nullptr )
            _form2Position = (dynamic_cast<Form^>(sender))->Bounds;
   }

   void OnFormClosed( Object^ /*sender*/, EventArgs^ /*e*/ )
   {
      
      // When a form is closed, decrement the count of open forms.
      // When the count gets to 0, exit the app by calling
      // ExitThread().
      _formCount--;
      if ( _formCount == 0 )
      {
         ExitThread();
      }
   }

   bool WriteFormDataToFile()
   {
      
      // Write the form positions to the file.
      UTF8Encoding^ encoding = gcnew UTF8Encoding;
      RectangleConverter^ rectConv = gcnew RectangleConverter;
      String^ form1pos = rectConv->ConvertToString( _form1Position );
      String^ form2pos = rectConv->ConvertToString( _form2Position );
      array<Byte>^dataToWrite = encoding->GetBytes( String::Concat( "~", form1pos, "~", form2pos ) );
      try
      {
         
         // Set the write position to the start of the file and write
         _userData->Seek( 0, SeekOrigin::Begin );
         _userData->Write( dataToWrite, 0, dataToWrite->Length );
         _userData->Flush();
         _userData->SetLength( dataToWrite->Length );
         return true;
      }
      catch ( Exception^ ) 
      {
         
         // An error occurred while attempting to write, return false.
         return false;
      }

   }

   bool ReadFormDataFromFile()
   {
      
      // Read the form positions from the file.
      UTF8Encoding^ encoding = gcnew UTF8Encoding;
      String^ data;
      if ( _userData->Length != 0 )
      {
         array<Byte>^dataToRead = gcnew array<Byte>(_userData->Length);
         try
         {
            
            // Set the read position to the start of the file and read.
            _userData->Seek( 0, SeekOrigin::Begin );
            _userData->Read( dataToRead, 0, dataToRead->Length );
         }
         catch ( IOException^ e ) 
         {
            String^ errorInfo = dynamic_cast<String^>(e);
            
            // An error occurred while attempt to read, return false.
            return false;
         }
         
         // Parse out the data to get the window rectangles
         data = encoding->GetString( dataToRead );
         try
         {
            
            // Convert the String* data to rectangles
            RectangleConverter^ rectConv = gcnew RectangleConverter;
            String^ form1pos = data->Substring( 1, data->IndexOf( "~", 1 ) - 1 );
            _form1Position =  *safe_cast<Rectangle^>(rectConv->ConvertFromString( form1pos ));
            String^ form2pos = data->Substring( data->IndexOf( "~", 1 ) + 1 );
            _form2Position =  *safe_cast<Rectangle^>(rectConv->ConvertFromString( form2pos ));
            return true;
         }
         catch ( Exception^ ) 
         {
            
            // Error occurred while attempting to convert the rectangle data.
            // Return false to use default values.
            return false;
         }
      }
      else
      {
         
         // No data in the file, return false to use default values.
         return false;
      }
   }
};
// The class that handles the creation of the application windows
class MyApplicationContext : ApplicationContext
{

    private int _formCount;
    private AppForm1 _form1;
    private AppForm2 _form2;

    private Rectangle _form1Position;
    private Rectangle _form2Position;

    private FileStream _userData;

    private MyApplicationContext()
    {
        _formCount = 0;

        // Handle the ApplicationExit event to know when the application is exiting.
        Application.ApplicationExit += new EventHandler(this.OnApplicationExit);

        try
        {
            // Create a file that the application will store user specific data in.
            _userData = new FileStream(Application.UserAppDataPath + "\\appdata.txt", FileMode.OpenOrCreate);
        }
        catch (IOException e)
        {
            // Inform the user that an error occurred.
            MessageBox.Show("An error occurred while attempting to show the application." +
                            "The error is:" + e.ToString());

            // Exit the current thread instead of showing the windows.
            ExitThread();
        }

        // Create both application forms and handle the Closed event
        // to know when both forms are closed.
        _form1 = new AppForm1();
        _form1.Closed += new EventHandler(OnFormClosed);
        _form1.Closing += new CancelEventHandler(OnFormClosing);
        _formCount++;

        _form2 = new AppForm2();
        _form2.Closed += new EventHandler(OnFormClosed);
        _form2.Closing += new CancelEventHandler(OnFormClosing);
        _formCount++;

        // Get the form positions based upon the user specific data.
        if (ReadFormDataFromFile())
        {
            // If the data was read from the file, set the form
            // positions manually.
            _form1.StartPosition = FormStartPosition.Manual;
            _form2.StartPosition = FormStartPosition.Manual;

            _form1.Bounds = _form1Position;
            _form2.Bounds = _form2Position;
        }

        // Show both forms.
        _form1.Show();
        _form2.Show();
    }

    private void OnApplicationExit(object sender, EventArgs e)
    {
        // When the application is exiting, write the application data to the
        // user file and close it.
        WriteFormDataToFile();

        try
        {
            // Ignore any errors that might occur while closing the file handle.
            _userData.Close();
        }
        catch { }
    }

    private void OnFormClosing(object sender, CancelEventArgs e)
    {
        // When a form is closing, remember the form position so it
        // can be saved in the user data file.
        if (sender is AppForm1)
            _form1Position = ((Form)sender).Bounds;
        else if (sender is AppForm2)
            _form2Position = ((Form)sender).Bounds;
    }

    private void OnFormClosed(object sender, EventArgs e)
    {
        // When a form is closed, decrement the count of open forms.

        // When the count gets to 0, exit the app by calling
        // ExitThread().
        _formCount--;
        if (_formCount == 0)
        {
            ExitThread();
        }
    }

    private bool WriteFormDataToFile()
    {
        // Write the form positions to the file.
        UTF8Encoding encoding = new UTF8Encoding();

        RectangleConverter rectConv = new RectangleConverter();
        string form1pos = rectConv.ConvertToString(_form1Position);
        string form2pos = rectConv.ConvertToString(_form2Position);

        byte[] dataToWrite = encoding.GetBytes("~" + form1pos + "~" + form2pos);

        try
        {
            // Set the write position to the start of the file and write
            _userData.Seek(0, SeekOrigin.Begin);
            _userData.Write(dataToWrite, 0, dataToWrite.Length);
            _userData.Flush();

            _userData.SetLength(dataToWrite.Length);
            return true;
        }
        catch
        {
            // An error occurred while attempting to write, return false.
            return false;
        }
    }

    private bool ReadFormDataFromFile()
    {
        // Read the form positions from the file.
        UTF8Encoding encoding = new UTF8Encoding();
        string data;

        if (_userData.Length != 0)
        {
            byte[] dataToRead = new byte[_userData.Length];

            try
            {
                // Set the read position to the start of the file and read.
                _userData.Seek(0, SeekOrigin.Begin);
                _userData.Read(dataToRead, 0, dataToRead.Length);
            }
            catch (IOException e)
            {
                string errorInfo = e.ToString();
                // An error occurred while attempt to read, return false.
                return false;
            }

            // Parse out the data to get the window rectangles
            data = encoding.GetString(dataToRead);

            try
            {
                // Convert the string data to rectangles
                RectangleConverter rectConv = new RectangleConverter();
                string form1pos = data.Substring(1, data.IndexOf("~", 1) - 1);

                _form1Position = (Rectangle)rectConv.ConvertFromString(form1pos);

                string form2pos = data.Substring(data.IndexOf("~", 1) + 1);
                _form2Position = (Rectangle)rectConv.ConvertFromString(form2pos);

                return true;
            }
            catch
            {
                // Error occurred while attempting to convert the rectangle data.
                // Return false to use default values.
                return false;
            }
        }
        else
        {
            // No data in the file, return false to use default values.
            return false;
        }
    }

    [STAThread]
    static void Main(string[] args)
    {

        // Create the MyApplicationContext, that derives from ApplicationContext,
        // that manages when the application should exit.

        MyApplicationContext context = new MyApplicationContext();

        // Run the application with the specific context. It will exit when
        // all forms are closed.
        Application.Run(context);
    }
}
' The class that handles the creation of the application windows
Public Class MyApplicationContext
    Inherits ApplicationContext

    Private _formCount As Integer
    Private _form1 As AppForm1
    Private _form2 As AppForm2

    Private _form1Position As Rectangle
    Private _form2Position As Rectangle

    Private _userData As FileStream

    Public Sub New()
        MyBase.New()
        _formCount = 0

        ' Handle the ApplicationExit event to know when the application is exiting.
        AddHandler Application.ApplicationExit, AddressOf OnApplicationExit

        Try
            ' Create a file that the application will store user specific data in.
            _userData = New FileStream(Application.UserAppDataPath + "\appdata.txt", FileMode.OpenOrCreate)

        Catch e As IOException
            ' Inform the user that an error occurred.
            MessageBox.Show("An error occurred while attempting to show the application." +
                            "The error is:" + e.ToString())

            ' Exit the current thread instead of showing the windows.
            ExitThread()
        End Try

        ' Create both application forms and handle the Closed event
        ' to know when both forms are closed.
        _form1 = New AppForm1()
        AddHandler _form1.Closed, AddressOf OnFormClosed
        AddHandler _form1.Closing, AddressOf OnFormClosing
        _formCount = _formCount + 1

        _form2 = New AppForm2()
        AddHandler _form2.Closed, AddressOf OnFormClosed
        AddHandler _form2.Closing, AddressOf OnFormClosing
        _formCount = _formCount + 1

        ' Get the form positions based upon the user specific data.
        If (ReadFormDataFromFile()) Then
            ' If the data was read from the file, set the form
            ' positions manually.
            _form1.StartPosition = FormStartPosition.Manual
            _form2.StartPosition = FormStartPosition.Manual

            _form1.Bounds = _form1Position
            _form2.Bounds = _form2Position
        End If

        ' Show both forms.
        _form1.Show()
        _form2.Show()
    End Sub

    Private Sub OnApplicationExit(ByVal sender As Object, ByVal e As EventArgs)
        ' When the application is exiting, write the application data to the
        ' user file and close it.
        WriteFormDataToFile()

        Try
            ' Ignore any errors that might occur while closing the file handle.
            _userData.Close()
        Catch
        End Try
    End Sub

    Private Sub OnFormClosing(ByVal sender As Object, ByVal e As CancelEventArgs)
        ' When a form is closing, remember the form position so it
        ' can be saved in the user data file.
        If TypeOf sender Is AppForm1 Then
            _form1Position = CType(sender, Form).Bounds
        ElseIf TypeOf sender Is AppForm2 Then
            _form2Position = CType(sender, Form).Bounds
        End If
    End Sub

    Private Sub OnFormClosed(ByVal sender As Object, ByVal e As EventArgs)
        ' When a form is closed, decrement the count of open forms.

        ' When the count gets to 0, exit the app by calling
        ' ExitThread().
        _formCount = _formCount - 1
        If (_formCount = 0) Then
            ExitThread()
        End If
    End Sub

    Private Function WriteFormDataToFile() As Boolean
        ' Write the form positions to the file.
        Dim encoding As UTF8Encoding = New UTF8Encoding()

        Dim rectConv As RectangleConverter = New RectangleConverter()
        Dim form1pos As String = rectConv.ConvertToString(_form1Position)
        Dim form2pos As String = rectConv.ConvertToString(_form2Position)

        Dim dataToWrite As Byte() = encoding.GetBytes("~" + form1pos + "~" + form2pos)

        Try
            ' Set the write position to the start of the file and write
            _userData.Seek(0, SeekOrigin.Begin)
            _userData.Write(dataToWrite, 0, dataToWrite.Length)
            _userData.Flush()

            _userData.SetLength(dataToWrite.Length)
            Return True

        Catch
            ' An error occurred while attempting to write, return false.
            Return False
        End Try

    End Function

    Private Function ReadFormDataFromFile() As Boolean
        ' Read the form positions from the file.
        Dim encoding As UTF8Encoding = New UTF8Encoding()
        Dim data As String

        If (_userData.Length <> 0) Then
            Dim dataToRead(_userData.Length) As Byte

            Try
                ' Set the read position to the start of the file and read.
                _userData.Seek(0, SeekOrigin.Begin)
                _userData.Read(dataToRead, 0, dataToRead.Length)

            Catch e As IOException
                Dim errorInfo As String = e.ToString()
                ' An error occurred while attempt to read, return false.
                Return False
            End Try

            ' Parse out the data to get the window rectangles
            data = encoding.GetString(dataToRead)

            Try
                ' Convert the string data to rectangles
                Dim rectConv As RectangleConverter = New RectangleConverter()
                Dim form1pos As String = data.Substring(1, data.IndexOf("~", 1) - 1)

                _form1Position = CType(rectConv.ConvertFromString(form1pos), Rectangle)

                Dim form2pos As String = data.Substring(data.IndexOf("~", 1) + 1)
                _form2Position = CType(rectConv.ConvertFromString(form2pos), Rectangle)

                Return True

            Catch
                ' Error occurred while attempting to convert the rectangle data.
                ' Return false to use default values.
                Return False
            End Try

        Else
            ' No data in the file, return false to use default values.
            Return False
        End If
    End Function

End Class

Public Module MyApplication
    Public Sub Main()
        ' Create the MyApplicationContext, that derives from ApplicationContext,
        ' that manages when the application should exit.

        Dim context As MyApplicationContext = New MyApplicationContext()

        ' Run the application with the specific context. It will exit when
        ' all forms are closed.
        Application.Run(context)
    End Sub
End Module

Uwagi

Pętla komunikatów jest uruchamiana do momentu Exit wywołania lub ExitThread wywołania zdarzenia w ThreadExit obiekcie kontekstu.

Zobacz też

Dotyczy

Run(Form)

Rozpoczyna uruchamianie standardowej pętli komunikatów aplikacji w bieżącym wątku i sprawia, że określony formularz jest widoczny.

public:
 static void Run(System::Windows::Forms::Form ^ mainForm);
public static void Run (System.Windows.Forms.Form mainForm);
static member Run : System.Windows.Forms.Form -> unit
Public Shared Sub Run (mainForm As Form)

Parametry

mainForm
Form

Obiekt Form reprezentujący formularz, który ma być widoczny.

Wyjątki

Główna pętla komunikatów jest już uruchomiona w bieżącym wątku.

Przykłady

Poniższy przykład kodu wyświetla numery w polu listy w formularzu. Za każdym razem, gdy klikniesz button1przycisk , aplikacja doda kolejny numer do listy.

Metoda Main wywołuje metodę Run , aby uruchomić aplikację, która tworzy formularz , listBox1i button1. Gdy użytkownik kliknie button1przycisk , button1_Click metoda dodaje cyfry jeden do trzech do pola listy i wyświetla wartość MessageBox. Jeśli użytkownik kliknie przycisk Nie na MessageBoxliście , button1_Click metoda doda kolejną liczbę do listy. Jeśli użytkownik kliknie przycisk Tak, aplikacja wywołuje metodę Exit w celu przetworzenia wszystkich pozostałych komunikatów w kolejce, a następnie zamknięcia.

Przykład wymaga utworzenia listBox1 i button1 umieszczenia go w formularzu.

public:
   static void main()
   {
      // Starts the application.
      Application::Run( gcnew Form1 );
   }

private:
   void button1_Click( Object^ sender, System::EventArgs^ e )
   {
      // Populates a list box with three numbers.
      int i = 3;
      for ( int j = 1; j <= i; j++ )
      {
         listBox1->Items->Add( j );
      }
      
      /* Determines whether the user wants to exit the application.
       * If not, adds another number to the list box. */
      while ( MessageBox::Show( "Exit application?", "",
         MessageBoxButtons::YesNo ) == ::DialogResult::No )
      {
         // Increments the counter ands add the number to the list box.
         i++;
         listBox1->Items->Add( i );
      }
      
      // The user wants to exit the application. Close everything down.
      Application::Exit();
   }
public static void Main(string[] args) {
    // Starts the application.
    Application.Run(new Form1());
 }

 private void button1_Click(object sender, System.EventArgs e) {
    // Populates a list box with three numbers.
    int i = 3;
    for(int j=1; j<=i; j++) {
       listBox1.Items.Add(j);
    }

    /* Determines whether the user wants to exit the application.
     * If not, adds another number to the list box. */
    while (MessageBox.Show("Exit application?", "", MessageBoxButtons.YesNo) ==
       DialogResult.No) {
       // Increments the counter ands add the number to the list box.
       i++;
       listBox1.Items.Add(i);
    }

    // The user wants to exit the application. Close everything down.
    Application.Exit();
 }
<STAThread()> _
Shared Sub Main() 	
   ' Starts the application.
   Application.Run(New Form1())
End Sub

Private Sub button1_Click(sender As object, e As System.EventArgs)
   ' Populates a list box with three numbers.
   Dim i As Integer = 3
   Dim j As Integer
   For j = 1 To i - 1
      listBox1.Items.Add(j)
   Next

   ' Checks to see whether the user wants to exit the application.
   ' If not, adds another number to the list box.
   While (MessageBox.Show("Exit application?", "", MessageBoxButtons.YesNo) = _ 
      DialogResult.No)
      ' Increments the counter and adds the number to the list box.
      i = i + 1
      listBox1.Items.Add(i)
   End While

   ' The user wants to exit the application. Close everything down.
   Application.Exit()
End Sub

Uwagi

Zazwyczaj główna funkcja aplikacji wywołuje tę metodę i przekazuje do niej główne okno aplikacji.

Ta metoda dodaje procedurę obsługi zdarzeń do parametru mainFormClosed zdarzenia. Procedura obsługi zdarzeń wywołuje metodę ExitThread w celu oczyszczenia aplikacji.

Uwaga

Metoda DisposeForm klasy zostanie wywołana przed zwróceniem tej metody.

Zobacz też

Dotyczy