显示ContextMenuStrip而不显示在任务栏中

时间:2008-09-25 11:01:09

标签: .net c++ winforms

我发现当我为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);

    }
}

我需要设置哪些其他选项,以便它不会在任务栏上显示空白过程。

4 个答案:

答案 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个上下文菜单项:ContextMenuLeftContextMenuRight。默认情况下,您已从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

希望这有帮助。