Окно приложения, отправленное за другими окнами при закрытии другого потока (С#)
Я пишу приложение 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();
}
Спасибо всем!