0

独自のオプション ウィンドウを備えた小さなアプリを作成しようとしています。ウィンドウを起動しようとすると、新しいフォームにフォーカスを設定できないようです。これは 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

これらのすべてのケースで、フォームは表示されますが、生成されたフォームはまだ新しいフォームにフォーカスがあります。これは、新しいフォームを作成する前に古いフォームを無効にしても発生します。

助言がありますか?

4

7 に答える 7

12

これForm.canFocus()は、フォームが読み込まれるときにfalseが発生するためです。イベントで使用Form.Activate()Form.Shownます。それで全部です。

private void ServerForm_Shown(object sender, EventArgs e)
{
    this.Activate();
}
于 2009-12-29T16:20:51.283 に答える
1

私はこれで解決しました(@Joel Coehoornに感謝します):

form.WindowState = FormWindowState.Minimized;
form.Shown += delegate(Object sender, EventArgs e) {
    ((Form)sender).WindowState = FormWindowState.Normal;
};
form.ShowDialog();
于 2014-03-03T08:13:46.130 に答える
1

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;

}
于 2010-08-11T12:35:22.943 に答える
0

を呼び出してみてくださいShowDialog(this)。私が同じ問題に直面したとき、それは私の場合に役立ちました。

于 2010-12-09T10:41:48.427 に答える
0

これはうまくいくようです。まず、新しいフォームを作成します。

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の間にはある種の舞台裏の違いがあります。それが何であるかはよくわかりませんが、どういうわけかアクティブな親を設定することと関係があるとしか思えません。関数を構築するための呼び出しの後にコードを追加しても、親フォームにフォーカスが戻らないようです。それはすべきではありません。

于 2009-05-12T18:30:29.983 に答える
0

winforms アプリで許可されるユーザー インターフェイス スレッドは 1 つだけであることに注意してください。

を呼び出した、親フォームで何か操作していますForm.Show()か? これにより、親フォームが再びフォーカスされる可能性があります。

集中しようとしていたものをすべて削除し、フォームをアクティブにして、 への呼び出しだけに頼ってForm.Show()ください。これは、フォームをロードしてそれに集中するのに十分なはずです。どちらかといえば、メニュー項目ハンドラーで。への呼び出しの後のすべてをコメントアウトしてShow()、それが機能するかどうかを確認してください。逆方向に作業して、親フォームが再フォーカスされた原因を確認します。

于 2009-05-12T17:54:51.493 に答える
-1

で正しい親ウィンドウを設定しようとしましたForm.Show()か?

例えば:

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

編集:

あなたの質問にない何かが起こっています。所有しているウィンドウは TopMost ウィンドウですか?

于 2009-05-12T17:44:52.257 に答える