2010-02-05 59 views
36

我想讓它左鍵單擊NotifyIcon也會導致上下文菜單(使用ContextMenuStrip屬性進行設置)也會打開。我將如何實現這一目標?我必須處理點擊並找出自己的位置?
編輯:顯示與trayIcon.ContextMenuStrip.Show()結果的菜單是一些不良行爲:調用NotifyIcon的上下文菜單

菜單是不是在相同的位置顯示爲如果右鍵單擊NotifyIcon的(看來你不能設置至少在Windows 7上這是我正在運行的任務欄的x和y座標)。它會出現在任務欄上方(不是那麼大的一筆交易,但一致性會很好)。

當顯示菜單時,有一個額外的圖標添加到任務欄。

點擊菜單以外的地方不會關閉它(如果你右鍵點擊調出上下文菜單,點擊其他地方自動關閉上下文菜單)。

只是調用菜單,但是內置的右鍵單擊處理程序正在做它嗎?

回答

82

你通常會處理MouseClick事件檢測點擊調用ContextMenuStrip.Show()方法:

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

但是,沒有按實際上工作不正常,當您點擊外部CMS時,CMS不會關閉。根本問題是在this KB article中描述的Windows怪癖(又名「bug」)。

在你自己的代碼中調用這個解決方法是相當痛苦的,這種困擾是令人不快的。 NotifyIcon類在其ShowContextMenu() method中提供了這種解決方法,但由於它是一種私有方法,所以它們很難實現。反思可以繞過這個限制。 5年前我發現了這個黑客,沒有人報告它有問題。設置NFI的ContextMenuStrip屬性和實施MouseUp事件是這樣的:

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); 
     } 
    } 
+0

@msorens - 不遲到要編輯:)有一些更多的技巧來解決ApplicationContext的解決方法。搜索我的答案SetVisibleCore。 – 2010-11-15 22:47:09

+0

此解決方案不能將「NotifyIcon」菜單屬性分配給ContextMenuStrip對象;因此,解決一個不應該首先出現的問題的做法過於醜陋。有關更多信息,請參閱http://stackoverflow.com/questions/132612/show-a-contextmenustrip-without-it-showing-in-the-taskbar。 – 2013-11-09 02:06:28

+5

這完全是無稽之談。 – 2013-11-09 10:55:33

2

您可以在onClick事件線材的通知,然後圖標調用秀於上點擊

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

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

如果您處理的MouseUp,而不是點擊,你就能知道哪個按鈕被點擊,以及點擊的location。您可以使用此位置做爲位置來顯示文本菜單

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

使用下面的代碼顯示在右側和上NotifyIcon的左鍵點擊右鍵菜單,如果您覺得有任何問題,在arshad_mcs786 @ hotmail的給我發短信。 COM(艾爾沙德從Islamabd)
//System.Runtime.InteropServices使用THI作爲參考

[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) 
    }