Окно приложения отправляется за другими окнами при закрытии другого потока (C #) - PullRequest
15 голосов
/ 10 октября 2008

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

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

После завершения инициализации основного приложения отображается основная форма приложения, а заставка по-прежнему отображается поверх.

Пока все как положено.

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

Что может быть причиной того, что окна внезапно подпрыгивают "позади", как это?

Ответы [ 4 ]

11 голосов
/ 10 октября 2008

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

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

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

1 голос
/ 10 октября 2008

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

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

0 голосов
/ 29 мая 2010

Вы можете использовать код, подобный этому:

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

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

0 голосов
/ 10 октября 2008

Является ли заставка модальным диалоговым окном?

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

Код такой:

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

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

...