C# 禁用';要求';单击菜单提示时双击未聚焦窗口的步骤
很抱歉这个奇怪的标题,我目前正在玩WinForms,我想知道是否有什么方法可以让你不必在窗口未聚焦时“双击”窗口来激活菜单提示中的项目 当前,如果窗口未聚焦,我必须首先单击窗口以使其聚焦,然后再次单击menustrip项目,即使我的鼠标从一开始就悬停在menustrip项目上方C# 禁用';要求';单击菜单提示时双击未聚焦窗口的步骤,c#,winforms,C#,Winforms,很抱歉这个奇怪的标题,我目前正在玩WinForms,我想知道是否有什么方法可以让你不必在窗口未聚焦时“双击”窗口来激活菜单提示中的项目 当前,如果窗口未聚焦,我必须首先单击窗口以使其聚焦,然后再次单击menustrip项目,即使我的鼠标从一开始就悬停在menustrip项目上方 提前谢谢 尝试将此函数放入表单类中: protected override void WndProc(ref Message m) { int WM_PARENTNOTIFY = 0x0210; if (
提前谢谢 尝试将此函数放入表单类中:
protected override void WndProc(ref Message m) {
int WM_PARENTNOTIFY = 0x0210;
if (!this.Focused && m.Msg == WM_PARENTNOTIFY) {
// Make this form auto-grab the focus when menu/controls are clicked
this.Activate();
}
base.WndProc(ref m);
}
@Detmar答案中的方法将在窗口被破坏时聚焦窗口(请参阅)。如果应用程序中有多个窗口并且正在退出,则可能会导致问题。以下是一个在处理windows时不会触发的事件:
protected override void WndProc(ref Message m)
{
const int WM_PARENTNOTIFY = 0x0210;
if (!this.Focused && m.Msg == WM_PARENTNOTIFY)
{
const int WM_CREATE = 0x0001;
const int WM_DESTROY = 0x0002;
const int WM_LBUTTONDOWN = 0x0201;
const int WM_MBUTTONDOWN = 0x0207;
const int WM_RBUTTONDOWN = 0x0204;
const int WM_XBUTTONDOWN = 0x020B;
const int WM_POINTERDOWN = 0x0246;
int type = (int)(0xFFFF & (long)m.WParam);
switch (type)
{
case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_XBUTTONDOWN:
case WM_POINTERDOWN:
// Make this form auto-grab the focus when menu/controls are clicked
this.Activate();
break;
case WM_DESTROY:
case WM_CREATE:
//do nothing
break;
}
}
base.WndProc(ref m);
}