C# 如何使ToolStrip按钮在不首先单击窗体的情况下立即可单击?

C# 如何使ToolStrip按钮在不首先单击窗体的情况下立即可单击?,c#,winforms,focus,toolstrip,toolstripbutton,C#,Winforms,Focus,Toolstrip,Toolstripbutton,我有一个windows窗体应用程序,带有包含按钮的toolstrip。令人沮丧的是,当窗体没有聚焦时,我必须在任何按钮上单击两次才能使其启动。第一次单击似乎激活了表单,然后第二次单击按钮(或者,我可以单击表单上的任意位置,然后单击按钮一次)。如何修复此问题,以便即使表单未激活,也可以直接单击按钮 编辑:我觉得这应该是可行的,因为它可以在SQL Server Profiler和Visual Studio之类的程序中工作(不是说这些程序使用WinForms,而是说这不是操作系统的问题)。试试这样的方

我有一个windows窗体应用程序,带有包含按钮的toolstrip。令人沮丧的是,当窗体没有聚焦时,我必须在任何按钮上单击两次才能使其启动。第一次单击似乎激活了表单,然后第二次单击按钮(或者,我可以单击表单上的任意位置,然后单击按钮一次)。如何修复此问题,以便即使表单未激活,也可以直接单击按钮


编辑:我觉得这应该是可行的,因为它可以在SQL Server Profiler和Visual Studio之类的程序中工作(不是说这些程序使用WinForms,而是说这不是操作系统的问题)。

试试这样的方法:

[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按钮上方,如果是,请调用
PerformClick()

private void Form1\u已激活(对象发送方,事件参数e)
{
对于(int i=0;i

(18和32是toolstripcontainer相对于表单位置的偏移)。也许有一种方法可以实际计算X和Y偏移量应该是多少,但这对我来说很有效。看来是个好主意。耐心等待回答我认为这些是最好的答案:我更新了我的例子。现在它适用于
ToolStrip
,并跳过其他控件的过多单击。我发现类似的方法效果很好,只需确保设置
myToolStrip.ClickThrough=true
。这对右键单击不起作用,右键单击也有同样的问题。
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();
    }
}