Frage

Ich mag es so haben, die auch auf den NotifyIcon links klicken Sie das Kontextmenü verursacht (Set mit der Context Eigenschaft) als auch zu öffnen. Wie würde ich das erreichen? Muss ich zu handhaben Sie und herauszufinden, die Positionierung selbst?
Edit: zeigt das Menü mit trayIcon.ContextMenuStrip.Show () Ergebnisse ist ein paar unerwünschte Verhaltensweisen:

Das Menü nicht an der gleichen Stelle gezeigt wird, als ob rechts die NotifyIcon klicken (es scheint, dass Sie nicht auf die x- und y-Koordinaten, wo die Taskleiste ist, zumindest unter Windows 7, die festlegen, was ich renne ). Es wird über der Taskleiste erscheint (nicht, dass große Sache, aber Konsistenz wäre schön).

Während das Menü angezeigt wird, gibt es ein zusätzliches Symbol in die Taskleiste hinzugefügt.

irgendwo Ein Klick auf andere als das Menü nicht schließt es nicht (während, wenn Sie mit der rechten Maustaste das Kontextmenü klicken anderes zu bringen, wo automatisch das Kontextmenü geschlossen).

Ist es überhaupt möglich, nur das Menü aufrufen, aber die in der rechten Maustaste Handler gebaut wird, es zu tun?

War es hilfreich?

Lösung

Normalerweise würden Sie behandeln das Mouseclick-Ereignis das Klicken und rufen Sie den ContextMenuStrip.Show () -Methode zu ermitteln:

    private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) {
        contextMenuStrip1.Show(Control.MousePosition);
    }

Aber das ist eigentlich nicht richtig funktioniert, schließen Sie das CMS nicht, wenn Sie außerhalb des Fensters klicken. Zugrunde liegendes Problem ist eine Windows-Marotte (auch bekannt als "Bug"), die in diesem KB-Artikel beschrieben.

Unter Berufung auf diese Problemumgehung in Ihrem eigenen Code ist ziemlich schmerzhaft, die pinvoke unangenehm ist. Die NotifyIcon Klasse hat diese Abhilfe in seinem ShowContextMenu () -Methode , machten sie nur schwer zu erhalten, da es sich um eine private Methode ist. Reflexion kann diese Beschränkung umgehen. Ich entdeckte diesen Hack vor 5 Jahren und niemand ein Problem damit noch berichtet. Legen Sie die Context Unterkunft NFI und implementieren das MouseUp-Ereignis wie folgt:

using System.Reflection;
...
    private void notifyIcon1_MouseUp(object sender, MouseEventArgs e) {
      if (e.Button == MouseButtons.Left) {
        MethodInfo mi = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
        mi.Invoke(notifyIcon1, null);
      }
    }

Andere Tipps

Wenn Sie MouseUp behandeln anstatt klicken, werden Sie in der Lage zu sagen, welche Schaltfläche geklickt wurde, sowie die Lage des Klicks. Sie können diese Position als Standort verwenden, um die ContextMenu zu zeigen

notifyIcon.MouseUp += new MouseEventHandler(delegate(object sender, MouseEventArgs e) { contextMenu.Show(e.Location); });

Sie können in einem onClick Ereignis verdrahten für Symbol benachrichtigen dann zeigen in der auf Klick aufrufen

private void wire()
{
     notifyIcon1.Click += new EventHandler(notifyIcon1_Click);
}

void notifyIcon1_Click(object sender, EventArgs e)
 {
    contextMenuStrip1.Show(Cursor.Position);
 }

Verwenden Sie den folgenden Code Kontextmenü anzuzeigen sowohl auf der rechten und linken Maustaste auf NotifyIcon, wenn Sie irgendeine Frage finden, dann Text ich bei arshad_mcs786@hotmail.com (arshad von Islamabd)
//System.Runtime.InteropServices verwenden thi als Referenz

    [DllImport("User32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
    public static extern bool SetForegroundWindow(HandleRef hWnd);

    private void notifyIcon1_Click(object sender, EventArgs e)
    {
        SetForegroundWindow(new HandleRef(this, this.Handle));
        int x = Control.MousePosition.X;
        int y = Control.MousePosition.Y;
         x = x - 10;
        y = y - 40;
        this.contextMenuStrip1.Show(x,y );
        //this.PointToClient(Cursor.Position)
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top