2010-09-04 5 views
5

Je veux montrer un WinForm dans le coin en bas à droite très juste au-dessus du plateau de système,Afficher un WinForm sur la zone de notification

Comment puis-je faire cela? Voici mon code:

public static void Notify() 
{   
    Rectangle workingArea = Screen.PrimaryScreen.WorkingArea; 
    Form fm = new Form(); 
    fm.ClientSize = new Size(200, 200); 
    int left = workingArea.Width - fm.Width; 
    int top = workingArea.Height - fm.Height; 
    fm.Location = new Point(left, top); 
    fm.ShowInTaskbar = false; 
    fm.ShowIcon = false; 
    fm.MinimizeBox = false; 
    fm.MaximizeBox = false; 
    fm.FormBorderStyle = FormBorderStyle.FixedToolWindow; 
    fm.Text = "Test"; 
    fm.TopMost = true; 
    fm.Show(); 
} 

Répondre

8

J'ai juste essayé cela et cela a fonctionné pour moi (note: ce code doit apparaître après le formulaire a été affiché pour la première fois - par exemple, vous pouvez le mettre dans le gestionnaire d'événements Load du formulaire, ou tout simplement l'inclure après tout appel à Show):

Rectangle workingArea = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea; 
int left = workingArea.Width - this.Width; 
int top = workingArea.Height - this.Height; 

this.Location = new Point(left, top); 

Que ce soit pour utiliser WorkingArea ou Bounds dépend de ce que vous entendez par "sur": si vous voulez dire "devant", utilisez Bounds, car il inclut la zone couvrant l'intégralité de l'écran (y compris l'espace occupé par la barre d'état système); Si vous voulez dire "ci-dessus", utilisez WorkingArea, qui inclut uniquement le bureau de l'utilisateur.

Je voudrais également préciser que vous voulez que votre formulaire soit affiché là-bas, n'est-ce pas? Si vous vouliez une icône dans la zone de notification, c'est à cela que sert le composant NotifyIcon.

+0

Merci, je viens de mettre à jour mon code, et ça ne marche pas !!! –

+0

@ Data-Base: Déplacez les lignes qui définissent l'emplacement du formulaire sur * après * vous appelez 'Show'. Windows Forms fait une chose étrange où il semble vous ignorer lorsque vous définissez la propriété 'Location' avant que le formulaire a été montré pour la première fois. –

+2

Je viens d'utiliser fm.StartPosition = FormStartPosition.Manual; code de Hans Passant et cela a fonctionné :-) –

4

Si vous voulez placer la forme sur/de la barre des tâches Infront:

Définissez les formes TopMost propriété à true. Vous pouvez utiliser Screen.PrimaryScreen.Bounds pour obtenir la résolution de l'écran puis définir correctement la position de votre formulaire.


Si vous voulez juste placer la forme juste au-dessus de la barre des tâches en bas à droite, vous pouvez alors faire comme suit:

Dans le concepteur de formulaire, goto Propriétés-> Événements et ajouter l'événement Load pour votre formulaire.

Ajouter les éléments suivants:

private void Form1_Load(object sender, EventArgs e) 
{ 
    this.StartPosition = FormStartPosition.Manual; 
    int x = Screen.PrimaryScreen.WorkingArea.Width - this.Width; 
    int y = Screen.PrimaryScreen.WorkingArea.Height - this.Height; 
    this.Bounds = new Rectangle(x, y, this.Width, this.Height); 
} 
+0

Je * pense * que l'OP signifiait "over" comme dans "above", plutôt que "top of"; donc 'TopMost' ne serait pas approprié. Je pourrais toutefois avoir tord. –

+0

Vrai que .. bien maintenant il a des options :) – hydrogen

+0

Merci beaucoup, maintenant j'ai corrigé ma question :-) –

5

Vous avez oublié celui-ci:

 fm.StartPosition = FormStartPosition.Manual; 

Qu'est-ce que vous aurez à travailler sur la prochaine est de mettre la barre des tâches, par exemple, le côté gauche de l'écran et l'exécution du code sur une machine qui a la vidéo Réglage DPI à une valeur différente (comme 125). Vous pouvez seulement positionner le formulaire avec précision dans son événement Load. Ne définissez pas la taille du client.

Questions connexes