Окно приложения, отправленное за другими окнами при закрытии другого потока (С#)

Я пишу приложение Windows Forms в С#.NET.

При запуске приложение отображает заставку, которая запускается в отдельном потоке. Пока отображается экран заставки, основное приложение инициализируется.

Как только основное приложение завершит инициализацию, отобразится основная форма приложения, и всплывающий экран по-прежнему отображается сверху.

Все до сих пор, как и ожидалось.

Затем экран заставки закрывается, из-за чего поток выйдет. По какой-то причине в данный момент основные окна приложений отправляются за всеми остальными открытыми окнами, особенно в окне проводника Windows, где вы щелкнули файл .exe, чтобы запустить приложение в первую очередь!

Что может заставить окна внезапно прыгать "за" так?

Ответы

Ответ 1

Попробуйте вызвать .Activate() в главном окне, когда ваш поток закрывается.

Он никогда не был активным и, следовательно, имел низкий Z-порядок, поэтому все выше будет, естественно, над ним. Я должен был исправить этот точный сценарий в нашем приложении.

Не забывайте! Возможно, вам понадобится маршалировать вызов к правильной теме, используя Invoke()!

Ответ 2

Я тоже это случалось. Ответ Боба самый легкий и работает для меня в большинстве случаев. Однако были случаи, когда мне нужно было использовать грубую силу. Сделайте это через interop следующим образом:

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

Ответ 3

Является ли заставкой диалогового окна Modal?

Я видел это окно "прыгает", если вы дважды увольняете диалог Modal, устанавливая оба DialogResult и вызывая Hide() или close().

Код вроде этого:

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

Смотрите эту запись в блоге для всех случаев...

Ответ 4

Вы можете использовать такой код:

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

Спасибо всем!