【问题标题】:Click lost on focusing form点击失去焦点表格
【发布时间】:2011-02-10 15:07:01
【问题描述】:

问题: 有没有办法通过对表单产生影响来始终让点击使表单成为焦点?

背景: 在我的(C# win 表单)应用程序失焦的情况下,我可以将鼠标悬停在表单上并获得指示鼠标位置的阴影和边框。

例如单击菜单项(文件),表单获得焦点,但文件菜单没有得到点击。这需要额外的点击。

对于表单上的普通按钮,只需单击一次。

【问题讨论】:

  • 由于这是菜单的标准行为,您会在几乎所有应用程序中找到它。出于这个原因,您可以取消“修复”此问题的重要性,因为用户已经习惯了它。如果此场景在您的应用程序中具有特殊含义,则例外。

标签: windows winforms focus click


【解决方案1】:

这可以通过在点击发生之前设置焦点来解决。代码:

class ToolStripEx : System.Windows.Forms.ToolStrip
{
    protected override void WndProc(ref Message m)
    {
        // WM_MOUSEACTIVATE = 0x21
        if (m.Msg == 0x21 && this.CanFocus && !this.Focused)
        {
            this.Focus();
        }
        base.WndProc(ref m);
    }
}

这种方法也适用于 MenuStrip

【讨论】:

    【解决方案2】:

    我发现了一些有用的文章——尤其是 Rick Brewster 的 this one。解决方案在于重写 ToolStrip(或 MenuStrip)的 WndProc 方法:

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
    
        if (this.clickThrough &&
            m.Msg == NativeConstants.WM_MOUSEACTIVATE &&
            m.Result == (IntPtr)NativeConstants.MA_ACTIVATEANDEAT)
        {
            m.Result = (IntPtr)NativeConstants.MA_ACTIVATE;
        }
    }
    

    【讨论】:

    • 还要确保在设计器代码中myToolStrip.ClickThrough = true 否则我发现它不起作用!
    猜你喜欢
    • 2012-04-30
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    相关资源
    最近更新 更多