Что приводит к тому, что окно не появляется на панели задач до тех пор, пока в Vista не появится Alt-Tabbed? - PullRequest
7 голосов
/ 18 марта 2009

Когда наше приложение запускается программно (через настраиваемое действие в установщике MSI или при запуске нового экземпляра) в Windows Vista (также происходит в бета-версии Windows 7), оно не отображается на панели задач и не отображается. Alt-tabbing к нему заставит его появиться на панели задач должным образом и остаться там.

Что вызывает это? Я видел это и в некоторых других приложениях и раньше, но не уверен почему. Наше приложение - это приложение .NET WinForms. Никогда не видел, чтобы это случилось в XP, только Vista и 7

Редактировать: Ну, похоже, единственный раз, когда это происходит воспроизводимо, это когда он запускается установщиком, я думаю, что есть и другие случаи, когда это происходит, но я могу просто сойти с ума. Код запуска немного сложен для публикации, потому что мы обрабатываем различные параметры запуска командной строки, и он запускает форму входа перед фактическим запуском основного приложения и т. Д.

Кто-нибудь должен был иметь дело с этим сценарием раньше и работал над ним?

Ответы [ 9 ]

3 голосов
/ 05 декабря 2012

Попробуйте проверить свой основной бланк заявления "Форма границы". Если это ToolWindow (Fixed или Sizable), попробуйте изменить его, например, на FixedDialog. Это решило проблему в моем случае.

1 голос
/ 29 марта 2016

Я тоже боролся с этой проблемой и обнаружил, что, как сказал предыдущий комментатор, в событии формы Load () не может быть ничего, что изменило бы это свойство FormBorderStyle. Переместите все, что изменяет его, в событие Shown ().

1 голос
/ 04 мая 2013

Ответ Г.Со заставил меня найти решение для моей проблемы, которое было вызвано тем фактом, что моя форма была значительной с момента запуска, но в загрузке пусто.

Если кому-то интересно, как мне удалось сохранить переключатель без полей и заставить его всплывать, как и должно быть на панели задач, без каких-либо грязных хаков ... вот оно ..

Создайте новое событие из формы в событии формы «Показано» и добавьте здесь строку кода для переключения на без полей. Проблема решена:)

    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, за то, что вы выяснили, что может вызвать это в первую очередь.

1 голос
/ 29 декабря 2009

Обычная причина этого заключается в том, что ваше главное окно приложения не имеет стилей окна, которые позволяют Windows знать, что это главное окно приложения (а не окно инструмента или диалоговое окно). Поэтому Windows приходится угадывать, основываясь на том, как было запущено приложение и т. Д.

Используйте Spy ++, чтобы пожаловаться на стили окна (особенно расширенные стили), если ваше окно совпадает с окном какого-либо другого окна, у которого нет этой проблемы. Вам не хватает стиля WS_EX_APPWINDOW? Отличаются ли другие стили / расширенные стили от других окон верхнего уровня?

0 голосов
/ 11 июля 2013

Мы столкнулись с той же проблемой, также в 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.

0 голосов
/ 02 мая 2013

В нашей ситуации это было отслежено до изменения свойства 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";
        }));
    ...
    ...
    ...
}
0 голосов
/ 03 марта 2010

У нас была та же проблема, и мы исправили ее, установив для свойства showintaskbar свойства true значение.

Странно, что все ОС Windows не запускают приложения одинаково!

0 голосов
/ 18 марта 2009

Ну, одним из решений является использование хака, такого как this . Это действительно не то, для чего это.

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

Эта статья написана на VB, но все она основана на вызовах API, поэтому информация, которую она предоставляет, не зависит от языка.

0 голосов
/ 18 марта 2009

Никогда не видел, чтобы это случилось в XP, только Vista и 7

Может быть, это ошибка в Vista ...?

Что произойдет, если вы вызовете SetForegroundWindow () (или эквивалент в .Net)?

Редактировать

Я, конечно, имел в виду "BringWindowToTop ()".

Или и то, и другое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...