C# 当我按下WindowsLogs+;时,ContextMenustrip不会自动关闭;D
我的应用程序中有名为“cmsView”的contextmenustrip。当我右键单击鼠标按钮时,cmsView已打开,并单击应用程序中cmsView关闭的某些位置。 如果我打开cmsView并按Windowslogo+D(即最小化应用程序),并且每当我单击应用程序中的某些内容并失去焦点时,cmsView不会关闭且处于打开状态 如何解决这个问题 问候,,C# 当我按下WindowsLogs+;时,ContextMenustrip不会自动关闭;D,c#,.net,winforms,contextmenustrip,C#,.net,Winforms,Contextmenustrip,我的应用程序中有名为“cmsView”的contextmenustrip。当我右键单击鼠标按钮时,cmsView已打开,并单击应用程序中cmsView关闭的某些位置。 如果我打开cmsView并按Windowslogo+D(即最小化应用程序),并且每当我单击应用程序中的某些内容并失去焦点时,cmsView不会关闭且处于打开状态 如何解决这个问题 问候,, Tanya这不是应用程序或控件中的错误。如果说有什么问题的话,那就是Windows中的弹出菜单控件存在缺陷,WinForms控件实际上是在模仿
Tanya这不是应用程序或控件中的错误。如果说有什么问题的话,那就是Windows中的弹出菜单控件存在缺陷,WinForms控件实际上是在模仿该缺陷,以便按照用户的预期进行操作 您可以在一个简单的应用程序(如记事本)中亲自测试这一点。打开一个新实例,右键单击文档区域,然后按Win+D。即使应用程序的窗口消失(最小化),上下文菜单仍将在桌面上保持打开和可见 因此,我不建议您尝试在应用程序中“修复”此问题。在罗马时,要像罗马人那样做 如果您必须尝试修复它,您可以尝试创建表单并手动指示上下文菜单关闭
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MINIMIZE = 0xf020;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SYSCOMMAND)
{
if (m.WParam.ToInt32() == SC_MINIMIZE)
{
// Close the context menu strip when the form is being minimized
cmsView.Close();
}
}
base.WndProc(ref m);
}
谢谢你。。但是有什么办法可以解决这个问题吗?即手动关闭contextmenustripThanks cody gray。。我知道怎么处理这件事。。感谢you@Tanya,如果它回答了您的问题,您应该将其标记为答案。
protected override void WndProc(ref Message m){if(m.Msg==WM_MENUCHAR){if(m.WParam.ToInt64()==MF_SYSMENU){if(cmsView!=null)cmsView.Close()}base.WndProc(ref m);}
我使用了上面的代码,当我按下WindowsLogo键时,除了窗口被最小化外,什么都没有发生。@Tanya:问题是你正在检查MF\U系统菜单
,它与上下文菜单不同。这是通过单击应用程序标题栏中的图标获得的窗口或系统菜单。此外,除非您使用的是ContextMenu
类(而不是ContextMenuStrip
类),否则将不会收到WM\u MENUCHAR
消息ContextMenuStrip
不是Win32 API菜单上的包装器。这些都是完全用.NET代码绘制的。