WindowsFormsApplicationBase SplashScreen заставляет форму входа игнорировать нажатия клавиш, пока я не нажму на нее - как отлаживать? - PullRequest
2 голосов
/ 23 декабря 2010

В моем приложении WinForms есть простая модальная форма входа в систему, которая вызывается при запуске через ShowDialog ().Когда я запускаю из Visual Studio, все работает нормально.Я могу просто ввести свой идентификатор пользователя, нажать клавишу Enter и войти в систему.

Но когда я запускаю сборку релиза напрямую, все выглядит нормально (форма входа активна, наИдентификатор пользователя MaskedEditBox), но все нажатия клавиш игнорируются, пока я не нажму где-нибудь в форме входа .Очень раздражает, если вы привыкли делать все с клавиатуры.

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

Любойпредложения, как отладить это (вне Visual Studio), или если это не удалось - возможный обходной путь?

Редактировать

Вот код вызова в моей основной форме:

    private void OfeMainForm_Shown(object sender, EventArgs e)
    {
        OperatorLogon();
    }

    private void OperatorLogon()
    {
        // Modal dialogs should be in a "using" block for proper disposal
        using (var logonForm = new C21CfrLogOnForm())
        {
            var dr = logonForm.ShowDialog(this);

            if (dr == DialogResult.OK)
                SaveOperatorId(logonForm.OperatorId);
            else
                Application.Exit();
        }
    }

Редактировать 2

Не думаю, что это актуально, но я использую Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase для этогозаставка и поддержка SingleInstanceController.

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

Редактировать 3

Изменено название, чтобы отразить лучшее понимание проблемы

Ответы [ 3 ]

1 голос
/ 23 декабря 2010

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

private void Form1_Shown(object sender, EventArgs e)
{
    Control control = FindFocusedControl(this);
    MessageBox.Show("The focused control " + control.Name + " is of type " + control.GetType());
}
public static Control FindFocusedControl(Control control)
{
    var container = control as ContainerControl;
    while (container != null)
    {
        control = container.ActiveControl;
        container = control as ContainerControl;
    }
    return control;
}

Если после этого ответ не очевиден, скажите нам, что вы получите.

1 голос
/ 23 декабря 2010

Я нашел хак ... э-э ... я имею в виду ... обходной путь, который решает проблему.Решение было похоронено в одном из комментариев этого ответа (спасибо, П. Брайан Макки, за предоставленную ссылку на связанный вопрос!)

Обходной путь - минимизировать главное окнопока отображается заставка, затем установите WindowState обратно на Normal перед отображением формы входа в систему.

В приведенном ниже коде см. строки с комментариями "HACK".

public class SingleInstanceController : WindowsFormsApplicationBase
{
    public SingleInstanceController()
    {
        this.IsSingleInstance = true;
    }

    /// <summary>
    /// When overridden in a derived class, allows a designer to emit code that 
    /// initializes the splash screen.
    /// </summary>
    protected override void OnCreateSplashScreen()
    {
        this.SplashScreen = new SplashScreen();
    }

    /// <summary>
    /// When overridden in a derived class, allows a designer to emit code that configures 
    /// the splash screen and main form.
    /// </summary>
    protected override void OnCreateMainForm()
    {
        // SplashScreen will close after MainForm_Load completed
        this.MainForm = new OfeMainForm();

        // HACK - gets around problem with logon form not having focus on startup
        // See also OfeMainForm_Shown in OfeMainForm.cs
        this.MainForm.WindowState = FormWindowState.Minimized;
    }
}


public partial class OfeMainForm : Form
{
    // ...

    private void OfeMainForm_Shown(object sender, EventArgs e)
    {
        // HACK - gets around problem with logon form not having focus on startup
        // See also OnCreateMainForm in Program.cs
        this.WindowState = FormWindowState.Normal;

        OperatorLogon();
    }

    // ...

}

Thisсейчас работает, но мне интересно, должен ли я явно открывать форму входа в систему из SingleInstanceController, а не из моей основной формы.

1 голос
/ 23 декабря 2010

UI focus / redraw / etc.Проблемы обычно довольно просты для устранения с помощью удаленной отладки.Т.е. используйте второй компьютер (виртуального достаточно), где ваше приложение работает.

Подробнее см. в этой статье MSDN .

...