Windowsは、ウィンドウがフォーカスの外に立ち上げ形成(および実行可能なフォルダの後ろ)
-
20-09-2019 - |
質問
私は、Windowsアプリケーションの起動中にいくつかの奇妙な行動を取得し、誰もが起こって、どのようにそれを回避することです何上の任意の光を投げることができればと思ったんだ。
問題は、アプリの起動である - それは、ログインフォームをスプラッシュ画面が表示されるはずです。このためのコードは次のとおりです。
[STAThread]
static void Main()
{
Application.ThreadException += Application_ThreadException;
MainForm mainForm = null;
Thread splashThread = new Thread(ShowSplash);
try
{
// set up app
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// Splash screen
Splash splash = new Splash();
splashThread.Start(splash);
// enable logging
log4net.Config.XmlConfigurator.Configure();
// Create main form
mainForm = new MainForm();
// kill splash
HideForm(splash);
splashThread.Abort();
}
catch (Exception e)
{
splashThread.Abort();
MessageBox.Show(e.Message, "An exception occurred: ", MessageBoxButtons.OK, MessageBoxIcon.Error);
Environment.Exit(0);
}
// start
Login login = new Login();
login.Show();
if (!mainForm.IsDisposed)
{
Application.Run(mainForm);
}
}
static void ShowSplash(object splash)
{
if (!(splash is Splash))
throw new ArgumentException("Splash screen is of wrong type.");
Splash splashForm = (Splash) splash;
splashForm.ShowDialog();
}
// Thread safe hide form
private delegate void HideFormCallback(Form form);
private static void HideForm(Form form)
{
if (form == null || form.IsDisposed)
return;
if (form.InvokeRequired)
{
HideFormCallback d = HideForm;
form.Invoke(d, new object[] { form });
}
else
{
form.Hide();
}
}
ですから、私たちは、ログインフォームを表示する前にスプラッシュ画面を殺し、その後、その間にアプリの残りの部分を設定し、スプラッシュスクリーンを持つ新しいスレッドを起動しています。
私がいる問題は、アプリの起動時にログインフォームがフォーカスを持っていないということです。スプラッシュ画面がポップアップし、期待通りに消えます。ログインフォームは、開いているウィンドウの前面にポップアップするものの、フォーカスを持っていません - (私が起動するために、ダブルクリックしたことを)実行可能ファイルを含むフォルダは、まだそれは、ログインフォームの背後にある場合でも、フォーカスされている。
。 私はスプラッシュ画面に関係するすべての行をコメントアウトした場合、それが表示されたら、は、ログインフォームにフォーカスしています。
私の推測では、スプラッシュ画面が隠されていますが、起動時にログインフォームがフォーカスを取得していない理由を私は知らないときに、フォーカスが戻って実行可能フォルダに戻りますことになります。
これは動作しませんnullのログインフォームのリターンに.Focus()を呼び出します。
どちらのフォーム、最上位またはそれらのようなセットを持っています。
誰もが何が起こっているのかについての提案を持っている場合は、、それははるかに高く評価されるだろう。
解決
これは私がややハックの修正としてやってしまったものです。
void LoginView_Shown(object sender, EventArgs e)
{
SetForegroundWindow(Handle);
this.BringToFront();
Activate();
}
[DllImport("user32")]
public static extern int SetForegroundWindow(IntPtr hwnd);
所属していません StackOverflow