Активировать форму и одновременно нажимать кнопку обработки?

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

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

Примечания:

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

person Amadeusz Wieczorek    schedule 04.08.2011    source источник


Ответы (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);
}

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

person dwidel    schedule 04.08.2011
comment
Просто примечание, это должно быть base.WndProc (ref m); - person Amadeusz Wieczorek; 05.08.2011
comment
Извините, я автоконвертировал это из VB. Я это исправлю. - person dwidel; 05.08.2011
comment
Первый кажется очень неприятным из-за имитации другого щелчка мыши. Я рекомендую принять второе решение, сфокусировав окно, прежде чем позволять обрабатывать щелчок. - person Ray; 23.09.2016

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

form.FormBorderStyle = FormBorderStyle.None
person mr.baby123    schedule 10.02.2014
comment
Ваш ответ, похоже, не имеет ничего общего с вопросом. - person LarsTech; 10.02.2014