【发布时间】:2009-10-04 12:03:16
【问题描述】:
当用户右键单击系统托盘中的通知图标时,我试图让我的应用程序显示一个弹出上下文菜单...但是有一个转折。
我知道我用来获取系统托盘中图标的 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 属性。
【问题讨论】:
标签: c# winforms menu popup contextmenu