【问题标题】:How to make a ToolStrip button immediately clickable without clicking on the form first? [duplicate]如何在不先单击表单的情况下立即单击 ToolStrip 按钮? [复制]
【发布时间】:2014-02-28 19:15:15
【问题描述】:

我有一个带有包含按钮的工具条的 Windows 窗体应用程序。令人沮丧的是,当表单没有聚焦时,我必须在任何按钮上单击两次才能触发它。第一次单击似乎激活了表单,然后第二次单击单击了按钮(或者,我可以单击表单上的任意位置,然后单击一次按钮)。我该如何解决这个问题,即使没有激活表单,我也可以直接点击按钮?

编辑:我觉得这应该是可行的,因为它适用于 SQL Server Profiler 和 Visual Studio 等程序(不是这些使用 WinForms,但它表明这不是操作系统问题)。

【问题讨论】:

标签: c# winforms focus toolstrip toolstripbutton


【解决方案1】:

试试这样的:

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;

private const int WM_PARENTNOTIFY = 0x210;
private const int WM_LBUTTONDOWN = 0x201;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_PARENTNOTIFY)
    {
        if (m.WParam.ToInt32() == WM_LBUTTONDOWN && ActiveForm != this)
        {
            Point p = PointToClient(Cursor.Position);
            if (GetChildAtPoint(p) is ToolStrip)
                mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, (uint)p.X, (uint)p.Y, 0, 0);
        }
    }
    base.WndProc(ref m);
}

编辑:现在适用于ToolStrip

【讨论】:

  • 我已经更新了我的示例。现在它适用于 ToolStrip 并跳过其他控件的过多点击。
  • 我发现类似的Rick Brewster's solution 效果很好,只要确保你设置了myToolStrip.ClickThrough = true
【解决方案2】:

这是执行此操作的另一种方法。您可以使用 Form 的 Activated 事件,然后检查鼠标是否在工具条按钮上,如果是,请调用 PerformClick()

private void Form1_Activated(object sender, EventArgs e)
{
    for (int i = 0; i < toolStrip1.Items.Count; i++)
    {
        ToolStripItem c = toolStrip1.Items[i];
        if (new RectangleF(new Point(i * (c.Size.Width - 1) + this.Location.X + 18, this.Location.Y + 32), c.Size).Contains(MousePosition))
            c.PerformClick();
    }
}

(18 和 32 是工具条容器相对于表单位置的偏移量)。可能有一种方法可以实际计算 X 和 Y 偏移应该是什么,但这对我有用。高温

【讨论】:

  • 这不适用于右键单击,也有同样的问题。
猜你喜欢
  • 2014-11-20
  • 1970-01-01
  • 2016-01-11
  • 2015-05-23
  • 2020-07-28
  • 2020-04-15
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多