Windows требует щелчка, чтобы активировать окно, прежде чем второй щелчок выберет кнопку.Как я могу изменить это? - PullRequest
13 голосов
/ 07 августа 2010

Мое приложение является приложением Windows Forms на C #, и .Net каким-то образом задает поведение по умолчанию для панели главного меню и кнопок панели инструментов так, что вам необходимо сначала щелкнуть окно моего приложения (где угодно), прежде чем оно позволит кнопка меню или полосы инструментов. Как я могу это изменить?

Старые приложения, такие как Блокнот и WordPad, не ведут себя таким образом. Но все приложения Microsoft Office делают. Но это так раздражает!

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

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

Обратите внимание, что элементы управления в диалоговых окнах моего приложения не проявляют этого глупого поведения. Почему они разные?

Ответы [ 4 ]

15 голосов
/ 09 августа 2010

Ну, в итоге я нашел свое собственное решение, которое было довольно простым.Я получаю свой собственный класс ToolStrip (и класс MenuStrip) следующим образом:

// This version of ToolStrip enables mouse click's even when the main form is NOT active.
private class MyToolStrip : ToolStrip
{
    const uint WM_LBUTTONDOWN = 0x201;
    const uint WM_LBUTTONUP   = 0x202;

    static private 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);
    }
}

Похоже, что, как и в Mac OS X, Windows приняла решение в стиле GUI, для которого требуется сначала активировать окно ДОэто позволит выбрать любые элементы управления.Однако Windows делает это только для определенных элементов управления, таких как ToolStrip и MenuStrip.Когда ваше окно НЕ активно, эти элементы управления не отправляют событие мыши ВНИЗ.Я не уверен, как WinForms применяет эту рекомендацию по GUI, но, возможно, он использует фильтр сообщений, используя Application.AddMessageFilter ().

Независимо от того, элементы управления MenuStrip по-прежнему получать событие мыши UPИ это вдохновило мое решение.Я просто ищу любое событие мыши UP, в котором отсутствует соответствующее событие DOWN.Когда я вижу этот специфический случай, я генерирую свое собственное событие мыши DOWN, и для элементов управления ToolStrip весь мир счастлив.: -)

1 голос
/ 24 мая 2018

простое и чистое решение

public class MyToolStrip : System.Windows.Forms.ToolStrip
{
    protected override void OnMouseEnter(EventArgs e)
    {
        if (this.CanFocus && !this.Focused)
            this.Focus();

        base.OnMouseEnter(e);
    }
}
0 голосов
/ 08 июня 2015

Это кажется более простым решением:

Зарегистрируйте компонент MainMenu на панели инструментов (в Visual Studio используйте меню «Инструменты», затем «Выбор элементов панели инструментов», затем найдите «MainMenu»), а затем используйте его в форме вместо MenuStrip.

0 голосов
/ 07 августа 2010

Вы можете обнаружить клик на своей форме, даже если приложение не имеет фокуса, если вы подпишитесь на событие MouseClick.

Затем, когда вы нажмете на форму, вы получите обратный вызоввне зависимости от того, была ли ранее форма или нет.

Тогда вы можете смоделировать щелчок по нужному элементу управления.

Это не очень элегантное решение, но оно должно работать.Вы должны убедиться, что клик не будет отправлен на кнопку панели инструментов дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...