Запретить анимацию в форме. Show () при активации из NotifyIcon - PullRequest
1 голос
/ 23 ноября 2010

У меня есть очень типичное хакерское решение для минимизации в системный трей в C #:

private void MainFormResize(object sender, EventArgs e) {
        if (FormWindowState.Minimized == this.WindowState) {
            this.Hide();
            systemTrayIcon.Visible = true;
        }
}

private void systemTrayIconMouseDoubleClick(object sender, MouseEventArgs e) {
    systemTrayIcon.Visible = false;
    this.Show();
    this.WindowState = FormWindowState.Normal;  
}

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

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

Я не хочу этого. Я просто хочу Minimize > -Poof- Disappear и Double-click > -Poof- Appear без анимации, задержек или чего-либо подобного.

Почему этот код имеет анимацию? Если я вызываю Form.Show() в любом другом контексте, окно автоматически появляется так, как я хочу, но при вызове из NotifyIcon оно действует странно. Я думал, что это может быть строка WindowState = FormWindowState.Normal, но если я уберу это, окно не будет выведено на передний план.

Редактировать : Эта проблема, похоже, зависит от ОС и темы. Проблема не в том, что существует в Windows XP, но трудно сказать, потому что моя виртуальная машина немного запаздывает. В Windows 7 Aero возникает проблема с положением вне экрана. В Windows 7 Basic / Classic она сворачивается на панель задач и вновь появляется со своей старой позиции на панели задач (как если бы она была фактически свернута на панель задач, а не на панель задач). Я не тестировал на Vista. Любые советы?

Ответы [ 3 ]

2 голосов
/ 23 ноября 2010

Вы пытались изменить порядок, чтобы поставить WindowState = FormWindowState.Normal до Show()? Я считаю, что анимация, которую вы видите, является стандартной анимацией восстановления окна. Поскольку вы звоните Show() перед восстановлением своего окна, оно получает позицию за пределами экрана.

Редактировать: Теперь я вижу вашу проблему - я смотрел на нее в течение секунды или около того, и даже попытался IMessageFilter, но по какой-то причине не смог перехватить WM_SYSCOMMAND при сворачивании (хотя он срабатывает на восстановление).

Единственная простая вещь, которую вы могли бы сделать, это использовать анимацию минимизации , однако - в вашем обработчике изменения размера, непосредственно перед вызовом Hide(), установите WindowState в Normal. Вы увидите анимацию минимизации, но не максимизацию (что на большинстве платформ намного менее заметно).

0 голосов
/ 23 апреля 2016

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

0 голосов
/ 23 ноября 2010

Если вам нужно скрыть окно при запуске программы, лучше всего создать класс, который наследуется от ApplicationContext и показывает NotifyIcon. Затем вы используете этот класс вместо формы в Application.Run.

class TaskTray : ApplicationContext
{
    private NotifyIcon _Icon;
    public TaskTray()
    {
       _Icon = new NotifyIcon();
       //...
    )
}
static void Main()
{
    Application.Run(new TaskTray());
}
...