Application.Run Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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
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 button1
przycisk , aplikacja doda kolejny numer do listy.
Metoda Main
wywołuje metodę Run , aby uruchomić aplikację, która tworzy formularz , listBox1
i button1
. Gdy użytkownik kliknie button1
przycisk , 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 mainForm
Closed zdarzenia. Procedura obsługi zdarzeń wywołuje metodę ExitThread w celu oczyszczenia aplikacji.