C # Новая форма никогда не получает фокус - PullRequest
0 голосов
/ 12 мая 2009

Я пытался написать небольшое приложение с собственными опциями Windows. Когда я пытаюсь запустить окно, я не могу сосредоточиться на новой форме. Это не форма mdi, а просто новая форма, которую я создаю, когда пользователь выбирает опцию в меню. Следует отметить, что Form.Show возвращает false, что означает, что новая форма никогда не получает фокус.

Я пробовал несколько способов загрузки формы, но все не удалось:

Из формы вызова:

ServerForm SF = new ServerForm(ref DataLoader, false);
SF.Show();
SF.Focus();
// Fails

Внутри самой формы:

this.Show();
this.BringToFront();
this.Activate();
this.TopMost = true;
// Fails

Выбор формы для выбора:

this.SetStyle(System.Windows.Forms.ControlStyles.Selectable, true);
...
ServerForm SF = new ServerForm(ref DataLoader, false);
SF.Show();
SF.Focus();
// Fails

Использование старого API:

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int ShowWindow(IntPtr handle, int nCmdShow);    
ServerForm SF = new ServerForm(ref DataLoader, false);
ShowWindow(SF.Handle, 3);
SF.Show();
SF.Focus();
// Fails

Переход в родительский

ServerForm SF = new ServerForm(ref DataLoader, false);
SF.Show(this);
SF.Focus();
// Fails

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

Есть предложения?

Ответы [ 7 ]

10 голосов
/ 29 декабря 2009

Это потому, что Form.canFocus() ложно при загрузке формы. Используйте Form.Activate() для события Form.Shown. Вот и все.

private void ServerForm_Shown(object sender, EventArgs e)
{
    this.Activate();
}
1 голос
/ 03 марта 2014

Я решил с этим (спасибо @ Joel Coehoorn ):

form.WindowState = FormWindowState.Minimized;
form.Shown += delegate(Object sender, EventArgs e) {
    ((Form)sender).WindowState = FormWindowState.Normal;
};
form.ShowDialog();
1 голос
/ 11 августа 2010

Установить TopMost свойство формы в true. Тогда

в program.cs:

var formLogin = new frmLogin();
formLogin.ShowDialog();


if (formLogin.DialogResult == DialogResult.Yes)
{
        Application.Run(new frmMain());
}

в формеВход:

[DllImport("user32")]
public static extern int SetForegroundWindow(IntPtr hwnd);         

...

private void frmLogin_Shown(object sender, EventArgs e)
{
  SetForegroundWindow(this.Handle);
}

private void frmLogin_Deactivate(object sender, EventArgs e)
{
    TopMost = false;

}
0 голосов
/ 09 декабря 2010

Попробуйте позвонить ShowDialog(this). Это помогло в моем случае, когда я столкнулся с той же проблемой.

0 голосов
/ 12 мая 2009

Это похоже на работу. Сначала я создаю новую форму:

private void changeDefaultServerToolStripMenuItem_Click(object sender, EventArgs e)
{
    this.Enabled = false;
    ServerForm SF = new ServerForm(ref DataLoader, true);
}

Затем в конструкторе для новой формы я делаю следующее:

this.BringToFront();
this.CenterToParent();
this.TopMost = true;
this.ShowDialog();

Очевидно, что есть какая-то разница между Form.Show и Form.ShowDialog. Не совсем уверен, что это такое, я могу только думать, что это как-то связано с установкой активного родителя. Добавление кода после вызова для создания функции, по-видимому, не возвращает фокус родительской форме. Что не должно.

0 голосов
/ 12 мая 2009

Помните, что в приложении winforms разрешен только один поток пользовательского интерфейса.

Управляете ли вы чем-нибудь в родительской форме после вашего звонка на Form.Show()? это может привести к тому, что родительская форма будет снова сфокусирована.

Удалите все, что вы использовали, чтобы попытаться сфокусироваться, активируйте форму и положитесь только на вызов Form.Show(). Этого должно быть достаточно, чтобы загрузить форму и сосредоточиться на ней. Если что, в вашем обработчике пункта меню. Закомментируйте все после вашего звонка на Show() и посмотрите, работает ли это. Поработайте в обратном направлении, чтобы увидеть, что привело к перефокусировке вашей родительской формы.

0 голосов
/ 12 мая 2009

Вы пытались установить правильное родительское окно в Form.Show()?

например:.

using(ServerForm SF = new ServerForm(ref DataLoader, false)) // if ServerForm is IDisposable
{
    SF.Show(this);
}

Edit:

Что-то происходит, что не в вашем вопросе. Является ли ваше собственное окно окном TopMost?

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