Как сделать так, чтобы кнопка ToolStrip сразу нажималась, не нажимая сначала на форму?
У меня есть приложение Windows Forms с панелью инструментов, которая содержит кнопки. К сожалению, я должен дважды щелкнуть любую кнопку, чтобы она сработала, когда форма не сфокусирована. Кажется, что первый щелчок активирует форму, а затем второй щелчок нажимает кнопку (альтернативно, я могу щелкнуть в любом месте формы, а затем нажать кнопку один раз). Как я могу это исправить, чтобы, даже когда форма не активирована, я мог нажать непосредственно на кнопку?
РЕДАКТИРОВАТЬ: я чувствую, что это должно быть выполнимо, так как он работает в таких программах, как SQL Server Profiler и Visual Studio (не то, что они используют WinForms, но это предполагает, что это не проблема ОС).
2 ответа
Попробуйте что-то вроде этого:
[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
сейчас.
Вот альтернативный способ сделать это. Вы можете использовать событие 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, но это сработало для меня. НТН