[英]Right clicking notifyicon in system tray does not show 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.