当用户右键单击系统托盘中的通知图标时,我正在尝试让我的应用程序显示弹出式上下文菜单…但有一个转折。
我知道我用来在系统托盘中获取图标的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.s how中是如何显示的,因为它需要相对于父控件(这里是我的主窗体)的弹出坐标,所以我很恼人地不得不从弹出坐标中减去父控件的坐标,这是我已经不想做的。
除此之外,我还有以下问题:
-
虽然右键单击时菜单会弹出,但如果我单击菜单外屏幕上的其他位置,它不会关闭,而且应该关闭。
-
菜单不会在正确的位置弹出;对于其他系统托盘应用程序,它会弹出,因此其右下角或左下角位于鼠标光标的顶端。对于我的,弹出菜单位于屏幕的底部,鼠标光标的一侧。
我有什么办法让这个更好的工作吗?我知道这是可能的,许多其他应用程序手动处理弹出菜单的显示,而不是使用一些notifyicon.contextmenu属性。