7

ボタンを含むツールストリップを備えた Windows フォーム アプリがあります。イライラすることに、フォームがフォーカスされていないときにボタンを起動するには、ボタンを 2 回クリックする必要があります。最初のクリックでフォームがアクティブになったように見え、次に 2 回目のクリックでボタンをクリックします (または、フォームの任意の場所をクリックしてからボタンを 1 回クリックすることもできます)。フォームがアクティブ化されていない場合でも、ボタンを直接クリックできるようにするにはどうすればよいですか?

編集: SQL Server Profiler や Visual Studio などのプログラムで動作するため、これは実現可能だと思います (これらは WinForms を使用するわけではありませんが、OS の問題ではないことが示唆されます)。

4

2 に答える 2

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ます。

于 2014-02-28T19:26:48.357 に答える
0

これを行う別の方法を次に示します。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 は、フォームの位置からの toolstripcontainer のオフセットです)。X と Y のオフセットがどうあるべきかを実際に計算する方法があるかもしれませんが、これはうまくいきました。HTH

于 2014-02-28T19:58:47.683 に答える