2008-09-25 9 views
6

J'ai découvert que lorsque j'exécute la méthode show() pour un menu contextuel (un menu contextuel), si la position est en dehors de la forme à laquelle elle appartient, elle apparaît sur la barre des tâches aussi. J'essaye de créer un menu de clic droit pour quand cliquer sur le notifyicon, mais comme le menu plane au-dessus de la barre d'état système et non à l'intérieur du formulaire (comme le formulaire peut être minimisé en cliquant droit) il apparaît sur le la barre des tâches pour une raison étrangeAfficher un ContextMenuStrip sans qu'il n'apparaisse dans la barre des tâches

Voici mon code actuellement:

private: System::Void notifyIcon1_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { 

if(e->Button == System::Windows::Forms::MouseButtons::Right) { 

     this->sysTrayMenu->Show(Cursor->Position); 

    } 
} 

Quelles autres options dois-je mettre il ne montre pas un processus vide sur la barre des tâches.

+0

Ditto, j'ai eu le même problème/bug. –

Répondre

7

Essayez d'affecter votre menu à la propriété ContextMenuStrip de NotifyIcon plutôt que de l'afficher dans le gestionnaire de clic de souris.

+0

Ah! Tu es un génie! Je n'avais aucune idée qu'ils avaient une propriété pour cela! Je refaisais les choses de la même manière :) – Cetra

+0

Vous avez résolu mon problème également –

+0

Beaucoup d'autres contrôles ont aussi cette propriété. – Fantius

0

Le problème que j'ai, c'est que mon menu est disponible à la fois un double-clic du milieu et l'icône de notification. Lorsque vous cliquez avec le bouton droit de la souris sur l'icône de notification, il n'y a pas de bouton de la barre des tâches, mais lorsque vous affichez manuellement (Cursor.Position), le bouton de la barre des tâches s'affiche.

1

Supposons que vous avez 2 éléments de menu contextuel: ContextMenuLeft et ContextMenuRight. Par défaut, à partir des propriétés NotifyIcon, vous en avez déjà affecté un. Avant d'appeler le Left Button Click, changez-les, affichez le menu contextuel, puis modifiez-les à nouveau.

NotifyIcon.ContextMenuStrip = ContextMenuLeft; //let's asign the other one 
MethodInfo mi = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic); 
mi.Invoke(NotifyIcon, null); 
NotifyIcon.ContextMenuStrip = ContextMenuRight; //switch back to the default one 

Espérons que cela aide.

4

La meilleure et la droite, sans réflexion est la suivante:

{ 
    UnsafeNativeMethods.SetForegroundWindow(new HandleRef(notifyIcon.ContextMenuStrip, notifyIcon.ContextMenuStrip.Handle)); 
    notifyIcon.ContextMenuStrip.Show(Cursor.Position); 
} 

UnsafeNativeMethods.SetForegroundWindow est:

public static class UnsafeNativeMethods 
{ 
    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 
    public static extern bool SetForegroundWindow(HandleRef hWnd); 
} 
Questions connexes