前回の内容では、Application.Run せずに、ShowDialog() していました。
Application.Run() を起動してから諸々の処理を行わせるようにしないと、いろいろ問題が生じるそうです。
(メッセージポンプしゅぽしゅぽとか。メッセージループぐるぐるとか、そういうものの関係だそうです)
詳しくは、昨日の記事やコメントを参照して下さい。
http://blogs.wankuma.com/rti/archive/2006/12/25/53572.aspx
中さんのサンプルにもありましたが、Application.Run(New 認証フォーム()) として、認証フォーム内で認証させた結果で、メインフォームを開けば良いのです。
しかし、僕としては、やはり Application.Run(New メインフォーム()) と書きたいのです。
で、以下のようにしました。
今度はどうですか~?
public static class Program
{
  [STAThread]
  static void Main() {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    using (MainForm mainForm = new MainForm()) {
      Application.Run(mainForm);
    } // Dispose()
  }
}
public sealed partial class MainForm : Form
{
  private void MainForm_Shown(object sender, EventArgs e) {
    bool b = false;
    using (ユーザー認証 f = new ユーザー認証()) {
      if (f.ShowDialog() == DialogResult.Cancel) {
        this.Close();
      }
    } // Dispose()
  }
}
public partial class ユーザー認証 : Form
{
  public ユーザー認証() {
    this.InitializeComponent();
    this.DialogResult = DialogResult.Cancel;
  }
  private void okButton_Click(object sender, EventArgs e) {
    if (! this.無事認証された()) {
      MessageBox.Show("認証失敗です!!");
      return;
    }
    this.DialogResult = DialogResult.OK;
    this.Close();      
  }
  private void cancelButton_Click(object sender, EventArgs e) {
    this.DialogResult = DialogResult.Cancel;
    this.Close();
  }
  private bool 無事認証された() {
    // ここに認証コードを書く
  }
}
この方法では、メイン画面が表示された状態で認証フォームが表示されます。
これが嫌な人は、別の方法を考えて、ここにフィードバックして下さいw