15

C#.NET で Windows フォーム アプリケーションを作成しています。

起動時に、アプリケーションは別のスレッドで実行されているスプラッシュ スクリーンを表示します。スプラッシュ スクリーンが表示されている間、メイン アプリケーションは初期化されています。

メイン アプリケーションの初期化が完了すると、アプリケーションのメイン フォームが表示され、スプラッシュ スクリーンが引き続き上部に表示されます。

これまでのところ、すべてが期待どおりです。

次に、スプ​​ラッシュ画面が閉じられ、そのスレッドが終了します。なんらかの理由で、その時点で、メインのアプリケーション ウィンドウが、開いている他のすべてのウィンドウ、特にアプリケーションを最初に実行するために .exe ファイルをクリックした Windows エクスプローラー ウィンドウの背後に送信されます。

このようにウィンドウが突然「後ろ」にジャンプする原因は何ですか?

4

4 に答える 4

11

スレッドが閉じたら、メイン ウィンドウで .Activate() を呼び出してみてください。

アクティブになったことがないため、Z オーダーが低いため、より高いものは自然にそれより上になります。アプリでこの正確なシナリオを修正する必要がありました。

忘れないで!Invoke() を使用して正しいスレッドへの呼び出しをマーシャリングする必要がある場合があります。

于 2008-10-10T17:21:17.383 に答える
1

私も時々こうなったことがあります。Bob の応答は最も簡単で、ほとんどの場合、私にとってはうまくいきます。ただし、ブルート フォースを使用する必要がある場合がいくつかあります。次のように相互運用を介してこれを行います。

[DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd);

于 2008-10-10T17:43:33.593 に答える
0

スプラッシュ画面はモーダルダイアログですか?

DialogResultを設定し、Hide()またはclose()を呼び出して、モーダルダイアログを2回閉じると、このウィンドウが「ジャンプ」するのを見てきました。

このようなコード:

private void button1_Click(object sender, System.EventArgs e)
{
     this.DialogResult = DialogResult.Abort;
     this.Hide();
}

すべてのケースについては、このブログエントリを参照してください...

于 2008-10-10T18:18:50.870 に答える
-3

次のようなコードを使用できます:

private void button1_Click(object sender, System.EventArgs e)
{
     this.DialogResult = DialogResult.Abort;
     this.Hide();
}

皆さんありがとう!

于 2010-05-29T02:35:24.277 に答える