2010-11-22 22 views
1

J'ai une solution hackish très typique pour minimiser dans la barre système en C#:Prévenir animation sur form.Show() lorsqu'il est activé à partir d'un NotifyIcon

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; 
} 

Idéalement, je veux que mon application à disparaître/réapparaître en réduisant au minimum à ou réouverture à partir de la barre d'état système. Réduire à la barre d'état système fonctionne comme prévu - la fenêtre disparaît sans délai et une nouvelle icône apparaît.

Un double-clic sur l'icône a cependant des effets très étranges. La fenêtre subit une animation de redimensionnement à sa position - la fenêtre semble voler à partir d'un coin complètement aléatoire de l'écran.

Je ne veux pas ça. Je veux juste Minimize > -Poof- Disappear et Double-click > -Poof- Appear sans aucune animation ou des retards ou quoi que ce soit de ce genre.

Pourquoi ce code a-t-il une animation? Si j'appelle Form.Show() dans n'importe quel autre contexte, la fenêtre apparaît automatiquement comme je veux, mais lorsqu'elle est appelée à partir d'un NotifyIcon, elle agit bizarrement. Je pensais que ce pourrait être la ligne WindowState = FormWindowState.Normal, mais si j'enlève cela, la fenêtre n'est pas mise au premier plan.

Modifier: Ce problème semble être lié au système d'exploitation et au thème. Le problème n'apparaît pas pour exister dans Windows XP, mais c'est difficile à dire parce que ma machine virtuelle est un peu décalée. Dans Windows 7 Aero, le problème de position abitrary-offscreen se produit. Dans Windows 7 Basic/Classic, il se réduit à la barre des tâches et réapparaît à partir de son ancienne position dans la barre des tâches (comme s'il était réellement réduit à la barre des tâches, pas à la barre d'état système). Je n'ai pas testé sur Vista. Des conseils?

Répondre

2

Avez-vous essayé de réorganiser pour mettre WindowState = FormWindowState.NormalavantShow()? Je crois que l'animation que vous voyez est l'animation de restauration de fenêtre standard. Puisque vous appelez le Show() avant de restaurer votre fenêtre, vous obtenez une position hors écran.

Edit: Je vois votre question maintenant - je l'ai regardé pour une seconde ou, et même essayé un IMessageFilter, mais pour une raison quelconque ne pouvait pas piéger WM_SYSCOMMAND en réduisant au minimum (bien qu'il tire sur la restauration).

La seule chose facile que vous pourriez faire est en temps réel avec l'animation réduisent au minimum, bien que - dans votre gestionnaire de modification de taille, juste avant l'appel Hide(), mis WindowState à Normal. Vous verrez l'animation minimiser, mais pas le maximum (qui sur la plupart des plates-formes est beaucoup moins visible).

+0

Si je le fais, la fenêtre ne peut être affiché du tout. Il apparaît dans la barre des tâches, mais cliquer sur ce bouton pour le faire disparaître le re-minimise. – Corey

+0

J'ai ajouté un peu d'information supplémentaire à mon message si cela aide du tout. – Corey

+0

Merci pour le conseil, cet effet est un peu plus souhaitable.Le problème est maintenant que la modification de WindowState rappelle MainFormResize, et je suppose que quelque chose d'interne invoqué par MainFormResize que je ne peux pas contrôler essaye d'afficher la fenêtre quand WindowState.Normal est appelé. Ce qui me laisse avec est la forme minimise, puis réapparaît pendant une fraction de milliseconde (avec des contrôles noircis parce que le système ne peut pas charger le formulaire si vite), puis le cache. C'est assez étrange. – Corey

0

Si vous avez besoin de masquer la fenêtre lorsque le programme s'exécute, le mieux est de créer une classe dérivée de ApplicationContext et affiche NotifyIcon. Vous utilisez ensuite cette classe à la place du formulaire dans Application.Run.

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

Au moins, il est possible d'avoir l'animation proviennent de là où il faut - vous devez déplacer la fenêtre réduite près de la zone de notification de la barre: see my hack here