Windowsは、ウィンドウがフォーカスの外に立ち上げ形成(および実行可能なフォルダの後ろ)

StackOverflow https://stackoverflow.com/questions/1748286

  •  20-09-2019
  •  | 
  •  

質問

私は、Windowsアプリケーションの起動中にいくつかの奇妙な行動を取得し、誰もが起こって、どのようにそれを回避することです何上の任意の光を投げることができればと思ったんだ。

問題は、アプリの起動である - それは、ログインフォームをスプラッシュ画面が表示されるはずです。このためのコードは次のとおりです。

    [STAThread]
    static void Main()
    {
        Application.ThreadException += Application_ThreadException;
        MainForm mainForm = null;

        Thread splashThread = new Thread(ShowSplash);

        try
        {
            // set up app
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            // Splash screen
            Splash splash = new Splash();
            splashThread.Start(splash);

            // enable logging
            log4net.Config.XmlConfigurator.Configure();

            // Create main form
            mainForm = new MainForm();

            // kill splash
            HideForm(splash);
            splashThread.Abort();
        }
        catch (Exception e)
        {
            splashThread.Abort();
            MessageBox.Show(e.Message, "An exception occurred: ", MessageBoxButtons.OK, MessageBoxIcon.Error);
            Environment.Exit(0);
        }

        // start
        Login login = new Login();
        login.Show();

        if (!mainForm.IsDisposed)
        {
            Application.Run(mainForm);
        }
    }

    static void ShowSplash(object splash)
    {
        if (!(splash is Splash))
            throw new ArgumentException("Splash screen is of wrong type.");

        Splash splashForm = (Splash) splash;
        splashForm.ShowDialog();
    }

    // Thread safe hide form
    private delegate void HideFormCallback(Form form);
    private static void HideForm(Form form)
    {
        if (form == null || form.IsDisposed)
            return;

        if (form.InvokeRequired)
        {
            HideFormCallback d = HideForm;
            form.Invoke(d, new object[] { form });
        }
        else
        {
            form.Hide();
        }
    }

ですから、私たちは、ログインフォームを表示する前にスプラッシュ画面を殺し、その後、その間にアプリの残りの部分を設定し、スプラッシュスクリーンを持つ新しいスレッドを起動しています。

私がいる問題は、アプリの起動時にログインフォームがフォーカスを持っていないということです。スプラッシュ画面がポップアップし、期待通りに消えます。ログインフォームは、開いているウィンドウの前面にポップアップするものの、フォーカスを持っていません - (私が起動するために、ダブルクリックしたことを)実行可能ファイルを含むフォルダは、まだそれは、ログインフォームの背後にある場合でも、フォーカスされている。

。 私はスプラッシュ画面に関係するすべての行をコメントアウトした場合、それが表示されたら、

は、ログインフォームにフォーカスしています。

私の推測では、スプラッシュ画面が隠されていますが、起動時にログインフォームがフォーカスを取得していない理由を私は知らないときに、フォーカスが戻って実行可能フォルダに戻りますことになります。

これは動作しませんnullのログインフォームのリターンに.Focus()を呼び出します。

どちらのフォーム、最上位またはそれらのようなセットを持っています。

誰もが何が起こっているのかについての提案を持っている場合は、

、それははるかに高く評価されるだろう。

役に立ちましたか?

解決

これは私がややハックの修正としてやってしまったものです。

    void LoginView_Shown(object sender, EventArgs e)
    {
        SetForegroundWindow(Handle);
        this.BringToFront();
        Activate();           
    }

    [DllImport("user32")]
    public static extern int SetForegroundWindow(IntPtr hwnd); 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top