Активировать форму и кнопку процесса одновременно?
Я использую Windows Forms в C#.
У меня есть главная форма с парой инструментов, которые содержат toolStripButtons. После работы с другой формой, содержащей данные, основная форма теряет фокус, и нажатие на кнопку toolStripButton не запускает событие OnClick: первый щелчок активирует основную форму, и только второй щелчок фактически нажимает кнопку. Мне нужно, чтобы пользователь нажал кнопку только один раз, чтобы вызвать событие Click, любые идеи о том, как это сделать? Спасибо.
Примечания:
- я использовал MDI и не было никаких проблем, нажав на кнопки формы родителя. Но теперь главное - иметь формы, свободно плавающие на нескольких дисплеях.
- рабочие формы имеют основную форму в качестве собственности владельца, таким образом, они остаются поверх основной формы.
- когда я нажимаю на кнопку неактивной формы, ни один из MouseHover, MouseEnter, MouseDown или MouseUp не срабатывает. Это просто главное форма активирует событие, которое срабатывает.
- в основной форме есть treeView (внутри tabControl, внутри splitContainer, внутри панели). Его элементы выбираются при первом щелчке мыши, даже если основная форма неактивна. Я думаю, не все элементы равны!
2 ответов
что вам нужно сделать, это создать класс, который наследует ToolStrip
и занимается WndProc
. Это один из способов сделать это. Есть и другие.
private class MyToolStrip : ToolStrip
{
private const uint WM_LBUTTONDOWN = 0x201;
private const uint WM_LBUTTONUP = 0x202;
private static bool down = false;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_LBUTTONUP && !down)
{
m.Msg = (int)WM_LBUTTONDOWN;
base.WndProc(ref m);
m.Msg = (int)WM_LBUTTONUP;
}
if (m.Msg == WM_LBUTTONDOWN) down = true;
if (m.Msg == WM_LBUTTONUP) down = false;
base.WndProc(ref m);
}
}
Я также видел это решение:
protected override void WndProc(ref Message m)
{
// WM_MOUSEACTIVATE = 0x21
if (m.Msg == WM_MOUSEACTIVATE && this.CanFocus && !this.Focused)
this.Focus();
base.WndProc(ref m);
}
я столкнулся с этим в последнем месте, где я работал, я думаю, что решение, которое я придумал, больше похоже на последнее, но у меня нет доступа к точному коду, который я использовал.
если у вас есть форма без границ, поэтому эта логика работает для вас построен :)
form.FormBorderStyle = FormBorderStyle.None