7

Windows Vista で (MSI インストーラーのカスタム アクションを介して、または新しいインスタンスの開始時に) アプリをプログラムで開始すると (Windows 7 ベータ版でも発生します)、アプリはタスクバーに表示されず、フォーカスされません。Alt キーを押しながらタブ移動すると、タスクバーに適切に表示され、そこにとどまります。

これは何が原因ですか?これは以前に他のアプリでも見たことがありますが、理由はわかりません。Out アプリは .NET WinForms アプリです。これが XP で発生することはありません。Vista と 7 のみです。

編集:これが再現可能に発生するのは、インストーラーによって実行されたときだけのようです。他の場合もあると思いますが、私は気が狂っているかもしれません。さまざまなコマンド ライン起動パラメーターを処理し、メイン アプリなどを実際に起動する前にサインイン フォームを起動するため、起動コードを投稿するのは少し複雑です。

以前にこのシナリオに対処しなければならなかった人はいますか?

4

9 に答える 9

3

メイン アプリケーション フォームの "Form Border" プロパティを確認してみてください。ToolWindow (Fixed または Sizable) の場合は、たとえば FixedDialog に変更してみてください。これで私の場合の問題は解決しました。

于 2012-12-05T12:58:49.803 に答える
1

私もこの問題に苦労しましたが、以前のコメンターが言ったように、フォームの Load() イベントにその FormBorderStyle プロパティを変更するものを含めることはできません。それを変更するものはすべて Shown() イベントに移動します。

于 2016-03-29T19:15:03.517 に答える
1

これの通常の理由は、メイン アプリケーション ウィンドウが (ツール ウィンドウやダイアログ ボックスではなく) メイン アプリケーション ウィンドウであることを Windows に知らせるウィンドウ スタイルを持っていないことです。そのため、Windows はアプリの起動方法などに基づいて推測する必要があります。

Spy++ を使用して、ウィンドウ スタイル (特に拡張スタイル) を、この問題を抱えていない他のウィンドウのウィンドウと比較します。WS_EX_APPWINDOWスタイルに欠けていませんか?他のトップ レベル ウィンドウと異なる他のスタイル/拡張スタイルはありますか?

于 2009-12-28T23:00:24.630 に答える
0

私たちの状況では、これは、フォームの text プロパティがLoadイベント内で変更されていることが原因でした。

これを の中に入れた後BeginInvoke、この奇妙な動作は発生しなくなりました。

これが他の誰かに役立つことを願っています。

private void Form_Load(object sender, EventArgs e)
{
    ...
    ...
    ...
    // this needs to be inside a BeginInvoke otherwise it messes with the taskbar visibility
    this.BeginInvoke(new Action(() =>
        {
            this.Text = "Something new";
        }));
    ...
    ...
    ...
}
于 2013-05-02T16:41:26.197 に答える
0

さて、1 つの解決策は、このようなハックを使用することです。それは本当にそれが目的ではありません。

通常、ウィンドウがタスク バーに表示されるかどうかは、使用する境界線のスタイルに基づいて決定されます。リンク先の記事では、もう少し詳しく説明しています。ウィンドウが所有者を持っているかどうかについての記事のコメントは、インストーラーによって起動されたときにウィンドウが何らかの形で別の所有者を取得している可能性があるため、問題に非常に関連している可能性があります。

この記事は VB で書かれていますが、すべて API 呼び出しに基づいているため、提供される情報は言語に依存しません。

于 2009-03-18T18:49:55.310 に答える
0

これが XP で発生することはありません。Vista と 7 のみです。

Vistaのバグなのかな…?

SetForegroundWindow() (または .Net で同等のもの) を呼び出すとどうなりますか?

編集

もちろん、「BringWindowToTop()」という意味でした。

または両方を行います。

于 2009-03-18T18:21:28.373 に答える
0

Windows 8 でも同じ問題が発生しました。フォームが正しくフォーカスを受け取ることもありましたが、約 30% の確率でした。

さまざまな解決策を試しましたが、実際に機能したのは次の方法でした。

private void OnFormShown(object sender, EventArgs e)
{
    // Tell Windows that the Form is a main application window
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;

    // Even if true, enforce the fact that we will the application on the taskbar
    this.ShowInTaskbar = true;

    // Put the window to the front and than back
    this.BringToFront();
    this.TopMost = true;
    this.TopMost = false;

    // 'Steal' the focus.
    this.Activate();
}

さらに、Load イベント中にフォームのタイトルを設定しないようにします。

于 2013-07-11T07:47:22.867 に答える
0

これと同じ問題があり、フォーム プロパティの showintaskbar プロパティを true に設定して修正しました。

すべての Windows OS が同じ方法でアプリを実行しないのは奇妙です!

于 2010-03-03T08:56:41.693 に答える