Окно не активируется при запуске приложения из планировщика задач - PullRequest
1 голос
/ 24 февраля 2020

В моем приложении я пытаюсь сфокусировать текстовое поле, чтобы я мог набирать текст сразу после загрузки формы.
Когда отображается Form, я вижу, мигает ли курсор в TextBox, но если Я набираю что-то, что ничего не происходит.
Мне нужно нажать Окно, чтобы начать ввод текста в TextBox. Если я нормально запускаю свое приложение из Visual Studio, оно будет работать отлично, но если мое приложение будет запущено с использованием планировщика задач, то это произойдет.
У вас есть какой-нибудь совет?

Ниже приведен мой код:

this.TopMost = true;
textbox.Focus();

Я также пытался textbox.Select();, но это все равно не работает.

1 Ответ

2 голосов
/ 25 февраля 2020

Проблема: когда приложение запускается действием планировщика заданий, главное окно отображается как неактивное, и система уведомляет пользователя, мигающего значок приложения на панели задач. Это по проекту .

Простой обходной путь - установить WindowState = FormWindowState.Minimized окна запуска в конструкторе форм, а затем установить его обратно на FormWindowState.Normal после того, как окно завершило загрузку своего содержимого и готово к представлению, вызывая событие Shown .

Установка FormWindowState.Normal вызывает вызов на ShowWindow с nCmdShow на SW_SHOWNORMAL:

Активирует и отображает окно . Если окно свернуто или развернуто, система восстанавливает его исходный размер и положение. Приложение должно указывать этот флаг при первом отображении окна.

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

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

Если Окно необходимо переместить или изменить его размер, это необходимо сделать после сброса WindowState, так как Окно до этого находится в свернутом состоянии и не будет кэшировать положение значений размера.
Форма StartPosition должна быть установлена ​​в FormStartPosition.Manual

private async void MainForm_Shown(object sender, EventArgs e)
{
    await Task.Delay(500);
    this.WindowState = FormWindowState.Normal;
    this.ActiveControl = [A Control to activate];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...