Что приводит к тому, что окно не появляется на панели задач, пока в Vist a не появится Alt-Tabbed?
Когда наше приложение запускается программно (либо через настраиваемое действие в установщике MSI, либо при запуске нового экземпляра) в Windows Vista (также происходит в бета-версии Windows 7), оно не отображается на панели задач и не фокусируется. Alt-tabbing к нему заставит это появиться в панели задач должным образом и остаться там.
Что вызывает это? Я видел это и в некоторых других приложениях и раньше, но не уверен почему. Наше приложение - это приложение.NET WinForms. Никогда не видел, чтобы это случилось в XP, только Vista и 7
Редактировать: Ну, похоже, что единственное время, когда это происходит воспроизводимо, это когда он запускается установщиком, я думаю, что есть и другие случаи, когда это происходит, но я могу просто сойти с ума. Код запуска немного сложен для публикации, потому что мы обрабатываем различные параметры запуска командной строки, и он запускает форму входа перед фактическим запуском основного приложения и т. Д.
Кто-нибудь должен был иметь дело с этим сценарием раньше и решал его?
9 ответов
Попробуйте проверить свой основной бланк заявления "Форма границы". Если это ToolWindow (Fixed или Sizable), попробуйте изменить его, например, на FixedDialog. Это решило проблему в моем случае.
Обычная причина этого заключается в том, что ваше главное окно приложения не имеет стилей окна, которые позволяют Windows знать, что это главное окно приложения (а не окно инструмента или диалоговое окно). Поэтому Windows приходится догадываться, исходя из того, как было запущено приложение и т. Д.
Используйте Spy++, чтобы жаловаться на стили окна (особенно расширенные стили), если ваше окно совпадает с окном какого-либо другого окна, у которого нет этой проблемы. Вы скучаете по WS_EX_APPWINDOW
стиль? Отличаются ли другие стили / расширенные стили от других окон верхнего уровня?
Ответ Г. Со заставил меня найти решение для моей проблемы, которое было вызвано тем фактом, что у меня была значительная форма с момента запуска, но в пустоте загрузки было установлено значение без полей.
Если кому-то интересно, как мне удалось сохранить переключатель без полей и заставить его всплывать, как следует на панели задач, без каких-либо грязных хаков... вот оно...
Создайте новое событие из формы в событии формы "Показано" и добавьте сюда строку кода для перехода на без полей. Задача решена:)
private void Form1_Shown(object sender, EventArgs e)
{
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
}
and for the lazy ones ;) >>>>
this.Shown += new EventHandler(Form1_Shown);
Еще раз спасибо G.So за разъяснение, что могло вызвать это в первую очередь.
Я тоже боролся с этой проблемой и обнаружил, что, как сказал предыдущий комментатор, в событии формы Load() не может быть ничего, что изменило бы это свойство FormBorderStyle. Переместите все, что изменяет его, в событие Shown().
Никогда не видел, чтобы это случилось в XP, только Vista и 7
Может быть, это ошибка в Vista...?
Что произойдет, если вы вызовете SetForegroundWindow() (или эквивалент в.Net)?
редактировать
Я конечно имел ввиду "BringWindowToTop()".
Или сделать оба.
Ну, одно из решений - использовать такой взлом. Это действительно не то, для чего это.
Обычно решение о том, будет ли окно находиться на панели задач или нет, основывается на стилях границ, которые он использует. Статья, на которую я ссылаюсь, предоставляет немного больше деталей. Комментарий статьи о том, что у окна есть владелец или нет, вполне может иметь отношение к вашей проблеме, поскольку окно может каким-то образом получить другого владельца при запуске установщиком.
Эта статья написана на VB, но все она основана на вызовах API, поэтому информация, которую она предоставляет, не зависит от языка.
У нас была та же проблема, и мы исправили ее, установив для свойства showintaskbar свойства true значение true.
Странно, что все ОС Windows не запускают приложения одинаково!
Мы столкнулись с той же проблемой, также в Windows 8. Иногда форма правильно фокусировалась, но, скажем, ~30% времени.
Мы пробовали разные решения, но на самом деле работало следующее:
private void OnFormShown(object sender, EventArgs e)
{
// Tell Windows that the Form is a main application window
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
// Even if true, enforce the fact that we will the application on the taskbar
this.ShowInTaskbar = true;
// Put the window to the front and than back
this.BringToFront();
this.TopMost = true;
this.TopMost = false;
// 'Steal' the focus.
this.Activate();
}
Кроме того, мы гарантируем также не устанавливать заголовок формы во время события Load.
В нашей ситуации это отслеживалось до изменения свойства text формы внутри Load
событие.
После помещения этого внутрь BeginInvoke
Такого странного поведения больше не было.
Надеюсь, это поможет кому-нибудь еще.
пример
private void Form_Load(object sender, EventArgs e)
{
...
...
...
// this needs to be inside a BeginInvoke otherwise it messes with the taskbar visibility
this.BeginInvoke(new Action(() =>
{
this.Text = "Something new";
}));
...
...
...
}