Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

// This version of ToolStrip enables mouse click 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. Когда ваше окно НЕ активно, эти элементы управления не отправляют событие мыши DOWN. Я не уверен, как WinForms применяет этот GUI-ориентир, но, возможно, он использует фильтр сообщений, используя Application.AddMessageFilter().

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

Ответ 2

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

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

Ответ 3

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

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

Затем вы можете имитировать щелчок элемента управления, который вы хотите.

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