2012-04-25 7 views
0

なぜプロセスが終了した後、Windowsのタスクリストマネージャーに残っていますか?C#WinformプロセスがまだWindows上にあります。閉じるプログラムの後にタスクリストマネージャー

私は、ユーザーsuccesulyログイン後Form.cs

[STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Login()); 
     } 

のログインに使用

、私は別のマスターページ

this.Hide(); 
      Main_Usr oMainUsr = new Main_Usr();      
      oMainUsr.Visible = true; 

にリダイレクトし、このように私の擬似マスターページ:

public Main_Usr() 
     { 
      InitializeComponent(); 
      this.IsMdiContainer = true; 
     } 

私はmasterpageを閉じます、プロセスはまだWindowsのタスクリストマネージャーにあります。 しかし、ログインページを閉じると、Windowsタスクリストマネージャーのプロセスが終了します。

私はちょうどleログインページを隠しているので、それは意味ですか? 本当にプロセスを終了/終了するにはすべてのウィンドウを閉じる必要がありますか?事前に

おかげで、あなたを、 STEV

+0

にこれを追加します。あなたの答えのためにあなたを – Reniuz

答えて

3

winformsプロセスでは、メインアプリケーションフォームが閉じられているときに処理されます。メインアプリケーションフォームは、Application.Runコールで指定されたものです。あなたのケースでは、それはログインフォームです:

Application.Run(new Login()); 

Closeメソッドを呼び出す必要があります。 Hideを呼び出すか、Visibilityをfalseに設定すると、フォームはメモリに残ります。それはユーザーから隠されるだけです。

だから、所望の機能を達成するために、あなたはMain_Usrに、メインアプリケーションフォームを変更する必要があります。そして、Main_Userフォームの Loadイベントをサブスクライブ

static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Main_Usr()); // change main form 
} 

private void Main_User_Load(object sender, EventArgs e) 
{ 
    using (var loginForm = new Login()) 
    { 
     Hide(); // hide main form 

     if (loginForm.ShowDialog() != System.Windows.Forms.DialogResult.OK) 
     { 
      Close(); // close main form and kill process 
      return; 
     } 

     Show(); // show main form if user logged in successfully 
    } 
} 

UPDATEは:あなたがこの方法のように、すべての主要な方法で

static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    using(var loginForm = new Login()) 
     if (loginForm.ShowDialog() != System.Windows.Forms.DialogResult.OK) 
      return; 
    Application.Run(new Main_Usr()); // change main form 
} 

これを行うことができますが、通常、私は、メインフォームを非表示にして、ログインの下に表示されませんし、イベントハンドラに次の操作を行い形。この場合、Loadイベントハンドラを使用する必要があります。それはあなた次第です。

BTW winformsにはマスタページとページはありません。これはすべてASP.NET用です。ここにあなたはフォームを持っています:) LoginForm、MainFormなどのような名前を考えてみてください

0

Loginがクローズするアプリケーションの最後の形式ですので、あなただけのその後Main_Userを読み込む - Loginが隠されている場合でも、それは実際にまだそこにあります。 Windows Formsアプリケーションは、最後のフォームが閉じられると終了するように既定で設定されています。

1

これは、アプリケーションメッセージループがフォーム(Application.Run(new Login()))に関連付けられているためです。そのため、アプリケーションを開始したフォームを閉じてプロセスを終了する必要があります。

代わりに、あなただけのどこかに、Application.Run前に、店の資格情報をLoginForm.Show()を呼び出すと、ウィンドウを殺すdoesnの `t Application.Run(new Main_Usr)

+0

感謝を(メモしていないページを形成します)。 '[STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); ログインoLogin =新しいログイン(); oLogin.Show(); Application.Run(new Main_Usr()); } ' ログイン手続きの前にメインページを開きます – user609511

+0

lazyberezovskyさんの答えを見てください。具体的には、「更新」セクションにコードを書いてください。 –

0
this.Hide() 

を呼び出すことができます。

これは隠されたままであり、プロセスはメモリ内に残ります。 this.Close()はウィンドウを閉じ、そのオブジェクトをメモリから削除します。

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    var l = new Login(); 
    l.ShowDialog(); 
    if(l.Passed) 
     Application.Run(new Login()); 
} 

、ログインウィンドウ内合格プロパティを実装:

このような何かをすることをお勧めします。

ところで、内部にマルチスレッドがありますか? このタイプのエラーのもう一つの原因です。

+0

答えてくれてありがとうございますが、私はl.Passedを取得できません – user609511

+0

あなたはあなたのログインフォームを持っています。単に 'public bool Passed {get; set;}'を追加し、ログイン成功時にtrueに設定してください。 –

0

私はそれを見つけた、私はちょうどdizlogを使用します。

[STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Login oLogin = new Login(); 
      oLogin.ShowDialog(); 
      Application.Run(new Main_Usr()); 
     } 
+0

この場合、Main_Usrが常に表示されます。ログインが有効かどうか。 Main_Userを表示する前にログインが成功したかどうかを確認する –

0

iは、コードに@lazyberezovskyに従うと、あなただけのログインフォーム閉じる必要があります私のLogin.cs

private void simpleButton_Valider_Click(object sender, EventArgs e) 
     { 
     ..... 
      DialogResult = DialogResult.OK; 
        return; 
     ..... 
    } 
関連する問題