Активировать форму и обрабатывать нажатие кнопки одновременно? - PullRequest
7 голосов
/ 04 августа 2011

Я использую Windows Forms в C #.

У меня есть основная форма с парой панелей инструментов, которые содержат toolStripButtons. После работы с другой формой, содержащей данные, основная форма теряет фокус, и нажатие на toolStripButton не вызывает событие OnClick: первый щелчок активирует основную форму, и только второй щелчок фактически нажимает кнопку. Мне нужно, чтобы пользователь нажал кнопку только один раз, чтобы вызвать событие Click, есть идеи, как это сделать? Спасибо.

Примечания:

  • Я использовал MDI , и не было проблем с нажатием кнопок родительской формы. Но теперь первостепенное значение имеет возможность свободно перемещать формы между несколькими дисплеями.
  • Рабочие формы имеют основную форму как свойство Owner, таким образом, они остаются поверх главной формы.
  • Когда я нажимаю на кнопку неактивной формы, ни один из MouseHover, MouseEnter, MouseDown или MouseUp не срабатывает. Возникает событие Activate основной формы.
  • В главной форме есть древовидная структура (внутри tabControl, внутри splitContainer, внутри панели). Его элементы выбираются по первому щелчку мыши, даже если основная форма неактивна. Я думаю, что не все элементы управления равны!

Ответы [ 2 ]

7 голосов
/ 04 августа 2011

Что вам нужно сделать, это создать класс, который наследует 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);
}

Я столкнулся с этим в последний раз, когда работал, я думаю, что решение, которое я придумал, работало больше как последнее, но у меня нет доступа к точному коду, который я использовал.

0 голосов
/ 10 февраля 2014

если у вас есть Форма без границ, так что эта логика работала для вас встроенным:)

form.FormBorderStyle = FormBorderStyle.None
...