簡體   English   中英

如何在不使用NotifyIcon.ContextMenu的情況下獲得系統托盤功能?

[英]How to get system tray functionality WITHOUT using NotifyIcon.ContextMenu?

當用戶在系統任務欄中右鍵單擊我的通知圖標時,我試圖讓我的應用程序顯示一個彈出上下文菜單。

我知道我用來在系統任務欄中獲取圖標的NotifyIcon類具有ContextMenu屬性。 我不想使用它來獲取右鍵單擊彈出菜單,因為它始終顯示右鍵單擊彈出菜單,並且從不執​​行任何其他操作。 當我的主窗體顯示模式對話框時,我想右鍵單擊以激活主窗體,而不顯示彈出菜單。

所以,我猜我需要使用NotifyIcon.MouseClick事件,並在該事件中手動彈出菜單嗎? 到目前為止,這是我必須去的地方:

private NotifyIcon trayIcon;
private ContextMenu iconMenu;

private void frmMain_Load(object sender, EventArgs e) {
    // [...]
    this.trayIcon.MouseClick += new MouseEventHandler(trayIcon_MouseClick);
    iconMenu = new ContextMenu();
    // [...]
}

private void trayIcon_MouseClick(object sender, MouseEventArgs ea) {
    this.iconMenu.Show(Program.instanceFrmMain, new Point(System.Windows.Forms.Cursor.Position.X - Program.instanceFrmMain.Left, System.Windows.Forms.Cursor.Position.Y - Program.instanceFrmMain.Top));
}

注意iconMenu.Show中的方式,因為它需要相對於父控件(這里是我的主要形式)的彈出坐標,所以我很煩惱,必須從彈出坐標中減去父控件的坐標,而我已經做不到不想做。

除此之外,這是我遇到的問題:

  • 盡管右鍵單擊時確實會彈出菜單,但是如果我單擊菜單外屏幕上的其他位置,它不會關閉-應當。
  • 菜單沒有在正確的位置彈出; 對於其他系統任務欄應用程序,它將彈出,因此其右下角或左下角位於鼠標指針的尖端。 對於我的,彈出菜單位於屏幕底部,位於鼠標光標的旁邊。

有什么想法可以使它更好地工作嗎? 我知道有可能,許多其他應用程序手動處理彈出菜單的顯示,而不是使用某些NotifyIcon.ContextMenu屬性。

使用ContextMenuStrip屬性而不是ContextMenu ContextMenuStrip類具有一個Opening事件,您可以通過設置e.Cancel = true取消該事件。 這樣,您無需擔心菜單的位置,因為它是自動處理的

好的,好吧,我沒有設法獲得我在原始問題中所描述的功能,但是我設法找到了一種使用另一種方法達到預期效果的方法。

trayIcon.ContextMenu將ContextMenu附加到trayIcon.ContextMenu屬性,但是我將事件處理程序代碼附加到了上下文菜單本身的Popup屬性。 如果在該處理程序中,我.Clear了ContextMenu,則實際上它根本沒有出現,這使我的代碼可以選擇有效地阻止trayicon的彈出菜單顯示(如果需要)。 這就是我想要達到的效果。 如果改為在Popup事件處理程序代碼中填充ContextMenu,則該菜單將照常彈出,其中包含我所填充的內容。

如此,我設法以另一種方式解決了這個問題。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM