Application.Run 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
현재 스레드에서 표준 애플리케이션 메시지 루프를 실행하기 시작합니다.
오버로드
Run() |
폼을 사용하지 않고 현재 스레드에서 표준 애플리케이션 메시지 루프를 실행하기 시작합니다. |
Run(ApplicationContext) |
ApplicationContext를 사용하여 현재 스레드에서 표준 애플리케이션 메시지 루프를 실행하기 시작합니다. |
Run(Form) |
현재 스레드에서 표준 애플리케이션 메시지 루프의 실행을 시작하고 지정된 폼을 표시합니다. |
Run()
폼을 사용하지 않고 현재 스레드에서 표준 애플리케이션 메시지 루프를 실행하기 시작합니다.
public:
static void Run();
public static void Run ();
static member Run : unit -> unit
Public Shared Sub Run ()
예외
주 메시지 루프가 이미 이 스레드에서 실행되고 있는 경우
설명
Win32 기반 또는 Windows Forms 애플리케이션 메시지 루프는 마우스 클릭과 키보드 입력과 같은 사용자 이벤트를 처리 하는 코드에서 루틴입니다. 모든 실행 중인 Windows 기반 애플리케이션에는 주 메시지 루프를 호출 하는 활성 메시지 루프에 필요 합니다. 주 메시지 루프가 종료 되 면 애플리케이션이 종료 됩니다. Windows Forms 메서드가 호출되거나 ExitThread 기본 메시지 루프를 실행하는 스레드에서 메서드가 호출되면 이 루프가 닫힙니다Exit.
대부분의 Windows Forms 개발자는 이 버전의 메서드를 사용할 필요가 없습니다. 기능을 사용할지는 Run(Form) 오버 로드를 기본 폼이 닫힐 때 애플리케이션이 종료 되도록 기본 폼을 사용 하 여 애플리케이션을 시작 합니다. 기타 모든 상황에 대 한 사용 합니다 Run(ApplicationContext) 오버 로드를 제공 하는 것이 지는 ApplicationContext 보다 효과적으로 제어할 애플리케이션의 수명에 대 한 개체입니다.
추가 정보
적용 대상
Run(ApplicationContext)
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)
매개 변수
- context
- ApplicationContext
애플리케이션이 실행되는 ApplicationContext입니다.
예외
주 메시지 루프가 이미 이 스레드에서 실행되고 있는 경우
예제
예제에서는 두 개의 폼을 표시 하 고 모두 폼이 닫히면 애플리케이션을 종료 합니다. 애플리케이션 시작 및 종료, 경우에 각 폼의 위치가 기억 됩니다. 이 예제에 사용 하는 방법을 보여 줍니다.는 ApplicationContext, 함께 Application.Run(context)
애플리케이션을 시작 하는 경우 여러 개의 폼을 표시할 메서드.
클래스 MyApplicationContext
는 에서 ApplicationContext 상속되고 각 양식이 닫힌 시기를 추적하고 둘 다 있을 때 현재 스레드를 종료합니다. 클래스는 사용자에 대한 각 양식의 위치를 저장합니다. 양식 위치 데이터는 에 의해 UserAppDataPath결정된 Appdata.txt
위치에 만들어지는 파일로 저장됩니다. 합니다 Main
메서드 호출 Application.Run(context)
지정 하는 애플리케이션을 시작 합니다 ApplicationContext합니다.
및 AppForm2
양식에 AppForm1
대한 코드는 간결함을 위해 표시되지 않습니다.
ApplicationContext 전체 코드 목록에 대한 클래스 개요를 참조하세요.
// 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
설명
메시지 루프는 또는 ExitThread 가 호출되거나 컨텍스트 개체에서 ThreadExit 이벤트가 발생할 때까지 Exit 실행됩니다.
추가 정보
적용 대상
Run(Form)
현재 스레드에서 표준 애플리케이션 메시지 루프의 실행을 시작하고 지정된 폼을 표시합니다.
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)
매개 변수
예외
주 메시지 루프가 이미 현재 스레드에서 실행되고 있는 경우
예제
다음 코드 예제에서는 폼의 목록 상자에 숫자를 나열합니다. 클릭할 때마다 button1
, 애플리케이션 목록에 다른 숫자를 추가 합니다.
합니다 Main
메서드 호출 Run 폼을 만드는 애플리케이션을 시작할 listBox1
, 및 button1
합니다. 사용자가 를 클릭하면 button1
메서드는 button1_Click
목록 상자에 1~3개의 숫자를 추가하고 를 표시합니다 MessageBox. 사용자가 에서 아니요 를 MessageBox클릭하면 메서드가 button1_Click
목록에 다른 숫자를 추가합니다. 사용자가 클릭 하면 예, 애플리케이션이 호출 Exit 큐에 남아 있는 모든 메시지를 처리 하 고 종료 됩니다.
이 예제에서는 및 가 listBox1
button1
양식에 만들어지고 배치되어야 합니다.
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
설명
일반적으로 애플리케이션의 main 함수는이 메서드를 호출 하 고 애플리케이션의 주 창에 전달 합니다.
이 메서드는 이벤트의 매개 변수에 mainForm
이벤트 처리기를 추가합니다 Closed . 이벤트 처리기 호출을 ExitThread 애플리케이션을 정리 합니다.
추가 정보
적용 대상
.NET