我发现当我为contextmenustrip(右键菜单)执行show()方法时,如果该位置超出了它所属的表单的位置,它也会显示在任务栏上。
我试图在点击notifyicon时创建一个右键菜单,但由于菜单悬停在系统托盘上方而不是在窗体内(因为右键单击时窗体可以最小化)它显示在任务上酒吧有些奇怪的原因
这是我目前的代码:
private: System::Void notifyIcon1_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) {
if(e->Button == System::Windows::Forms::MouseButtons::Right) {
this->sysTrayMenu->Show(Cursor->Position);
}
}
我需要设置哪些其他选项,以便它不会在任务栏上显示空白过程。
答案 0 :(得分:7)
尝试将菜单分配给NotifyIcon的ContextMenuStrip属性,而不是在鼠标单击处理程序中显示它。
答案 1 :(得分:5)
没有反思的最好和正确的方法是:
{
UnsafeNativeMethods.SetForegroundWindow(new HandleRef(notifyIcon.ContextMenuStrip, notifyIcon.ContextMenuStrip.Handle));
notifyIcon.ContextMenuStrip.Show(Cursor.Position);
}
其中 UnsafeNativeMethods.SetForegroundWindow 是:
public static class UnsafeNativeMethods
{
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool SetForegroundWindow(HandleRef hWnd);
}
答案 2 :(得分:1)
我遇到的问题是我的菜单可以通过双击鼠标中选择和通知图标。
右键单击通知图标时,没有任务栏按钮,但是当我手动显示(Cursor.Position)时,它会显示任务栏按钮。
答案 3 :(得分:1)
假设您有2个上下文菜单项:ContextMenuLeft
和ContextMenuRight
。默认情况下,您已从NotifyIcon属性中分配了其中一个属性。在调用Left Button Click
之前,只需更改它们,显示上下文菜单,然后再次更改它们。
NotifyIcon.ContextMenuStrip = ContextMenuLeft; //let's asign the other one
MethodInfo mi = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
mi.Invoke(NotifyIcon, null);
NotifyIcon.ContextMenuStrip = ContextMenuRight; //switch back to the default one
希望这有帮助。