1

私には3つのフォームがあります-メインフォームはForm1で、他はスプラッシュフォームとログイン画面です。スプラッシュ画面が最初に表示され、サーバーにデータが入力されます。次に、frmAppLoginが表示され、ユーザーがハードコードされたパスワードを入力すると、結果がform1に戻ります。

public Form1()
    {
        _assembly = Assembly.GetExecutingAssembly();

        Stream icon = _assembly.GetManifestResourceStream.....

        this.Icon = new Icon(icon);

        Thread t = new Thread(new ThreadStart(SplashScreen));
        t.Start();
        InitializeComponent();
        PopulateServers();
        //Thread.Sleep(800);
        Form frmLogin1 = new frmAppLogin();
        t.Abort();

        frmLogin1.ShowDialog();


        DialogResult res = new DialogResult();
        res = frmLogin1.DialogResult;
        if (res == DialogResult.OK)
        {
            _LoggedIn = true;
        }

        else
        {
            _LoggedIn = false;
        }
 }

これはform1_loadのコードです:

private void Form1_Load(object sender, EventArgs e)
    {
        if (_LoggedIn)
        {
            try
            {
                blah blah........
            }
            catch
            {
                MessageBox.Show("Error accessing resources!");
            }
        }
        else
        {
            this.Close();
        }
    }

そして、ログインフォームのコード:

public frmAppLogin()
    {
        InitializeComponent();
        this.WindowState = FormWindowState.Normal;
    }


    private void btnAppLogin_Click(object sender, EventArgs e)
    {
        if (txtAppPass.Text.ToString() == requiredPass)
        {
            this.DialogResult = DialogResult.OK;
            this.Close();
        }
        else
        {
            txtAppPass.Clear();
            txtAppPass.Focus();
            MessageBox.Show("Incorrect Password");
        }
    }

問題は、スプラッシュ画面が消えると、ログインフォームが一瞬ポップアップしますが、すぐにタスクバーに最小化されることです。

Startpositionは、GUIを介してCenterScreenおよびWindowStateNormalに設定されます。

また、これは、debugフォルダーでapplication.exeを実行する(またはコピーする)場合にのみ発生します。つまり、VisualStudio2010でデバッグする場合には発生しません。

編集:これを追加するために、私も試しました:

   private void frmAppLogin_Load(object sender, EventArgs e)
    {
        this.WindowState = FormWindowState.Normal;
    }

それは役に立たなかった。

4

5 に答える 5

4

私はあなたがこれを間違って診断しているとかなり確信しています。ダイアログは最小化されず、別のアプリケーションのウィンドウの後ろに表示されなくなります。通常、Visual Studioは、誰もがそれを最大化するので、他のウィンドウをカバーするのが本当に得意です。他のウィンドウを最小化して、ダイアログを見つけます。

ここで問題になるのは、一瞬の間、Windowsにフォーカスを与えることができるウィンドウがアプリにないことです。実際には、スプラッシュ画面とログインフォームの間で2回。ここでも、ログインフォームとメインフォームの間です。Windowsウィンドウマネージャーは、フォーカスする別のウィンドウを見つけることを余儀なくされ、候補がないため、別のアプリのウィンドウを選択します。

ウィンドウマネージャーには、アプリに最初のウィンドウを作成する時間を与えることができますが、これには必然的に時間がかかります。あなたのスプラッシュスクリーンは間違いなくその論理を台無しにします。投稿されたとおりにコードを修復するのは簡単ではありません。アプリがまだメッセージループをポンピングしていないため、ShowDialog()を呼び出した後にコードを呼び出す標準的なトリックは機能しません。それ自体が問題です。少なくともスプラッシュ画面を修正することでこの問題への取り組みを開始してください。.NETにはすでにスプラッシュ画面がしっかりとサポートされています。答えはここにあります

于 2012-08-08T12:13:58.413 に答える
1
    t.Start();
    InitializeComponent(); 
    PopulateServers();
    Form frmLogin1 = new frmAppLogin();
    this.Activate(); //This Line will Solve your problem
    t.Abort();
于 2019-04-11T21:29:11.863 に答える
0

答えるのが遅すぎることはわかっています。私は同じ問題を抱えてこの投稿を読み、解決策を見つけようとしました。

Timerオブジェクトを作成して設定しInterval = 10、で開始しTimerましたForm Load event。次に、タイマーのTickイベントでダイアログボックスを開き、タイマーを停止して、を表示しましたlogin.showDialog()。それは私にとってはうまくいきます。以下のコードを参照してください。

        private Timer dispatcher;

        public MainView()
        {
            InitializeComponent();
            frmMdiChildList = new List<Form>();
            Load += new EventHandler(MainView_Load);
            FormClosing += new FormClosingEventHandler(MainView_FormClosing);
            Activated += new EventHandler(MainView_Activated);

        }

        void MainView_Load(object sender, EventArgs e)
        {
            dispatcher = new Timer();
            dispatcher.Interval = 10; //10 milliseconds
            dispatcher.Tick += new EventHandler(dispatcher_Tick);
            dispatcher.Start();
        }

        void dispatcher_Tick(object sender, EventArgs e)
        {
            dispatcher.Stop();
            dispatcher = null;
            showLoginForm();
        }

        private void showLoginForm() {
            Form loginForm = new LoginView();
            loginForm.ShowDialog();
        }
于 2013-12-20T12:32:50.583 に答える
0

フォームが一瞬ポップアップするが、すぐにタスクバーに最小化するという問題が発生する場合は、次の解決策が考えられます。

FormNew f = new FormNew();
f.Owner = this; // - this is the solution line
f.Show();
于 2013-12-24T16:37:52.413 に答える
0

私が取り組んでいたプログラムでも同じ問題が発生しました。これが私がそれを回避するためにしたことです。うまくいくようです。

私のメインフォームでは、コンストラクターとStartFormメソッドを次のように設定します。

public FrmMain()
{
    Thread thread = new Thread(new ThreadStart(StartForm));
    thread.Start();
    Thread.Sleep(7000);
    InitializeComponent();
    thread.Abort();
}

private void StartForm()
{
    Application.Run(new FrmSplash());
}

次に、メインフォームで、FrmMain_Load次のようにイベントを設定します。

private void FrmMain_Load(object sender, EventArgs e)
{
    Activate(); // Give focus to FrmMain and maximize window
}

終わり!

于 2019-11-13T16:11:16.980 に答える