C# - 全画面の winform アプリが常にタスクバーを覆わないのはなぜですか?
-
02-07-2019 - |
質問
私は Windows Vista と C#.net 3.5 を使用していますが、友人に XP でプログラムを実行してもらいましたが、同じ問題が発生しました。
したがって、SystemTray にアイコンを表示してバックグラウンドで実行している C# プログラムがあります。私は低レベルのキーボードフックを持っているので、2つのキー(この場合はCtr+windows)を押すと、アプリケーションのメインフォームを取得します。フォームは、コンボ キーを押した偶数ハンドラーで全画面になるように設定されています。
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
したがって、基本的には機能します。CTR+Windowsを押すと、どのプログラムにフォーカスを当てていたとしても、フォームが表示されます。しかし、場合によっては、タスクバーがフォームの上に表示されてしまうことがありますが、これは望ましくありません。キーコンボを押したときに常に全画面表示になるようにしたいです。
それは元々どのアプリケーションにフォーカスがあるかに関係があると思います。しかし、メインフォームをクリックしても、タスクバーがそこに残ることがあります。では、本当に集中力が問題なのでしょうか。時々、タスクバーが頑固で、プログラムの後ろに位置したくないようです。
これを修正する方法を知っている人はいますか?
編集:詳細 - フルスクリーンモードに入れたとき、またはPowerPointをプレゼンテーションモードにするときにWebブラウザが持つ効果を達成しようとしています。
Windows フォームでは、境界線のスタイルを none に設定し、ウィンドウを最大化することでこれを行います。ただし、何らかの理由でウィンドウがタスクバーを覆わない場合があります。半分の時間はそうなります。
メイン ウィンドウを最前面に配置すると、メイン ウィンドウをクリックすると他のウィンドウが後ろに隠れてしまいますが、タスク バーが非表示になっている場合はこれが望ましくありません。
解決
これを試してみてください(どこで this
はあなたのフォームです):
this.Bounds = Screen.PrimaryScreen.Bounds;
this.TopMost = true;
これにより、フォームが全画面表示に設定され、タスクバーが覆われます。
他のヒント
非常に多くの解決策を試しましたが、そのうちのいくつかは Windows XP では機能しましたが、そのすべては Windows 7 では機能しませんでした。結局のところ、そうするための簡単なメソッドを書きます。
private void GoFullscreen(bool fullscreen)
{
if (fullscreen)
{
this.WindowState = FormWindowState.Normal;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Bounds = Screen.PrimaryScreen.Bounds;
}
else
{
this.WindowState = FormWindowState.Maximized;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
}
}
コードの順序は重要であり、WindwosState と FormBorderStyle の場所を変更すると機能しなくなります。
このメソッドの利点の 1 つは、TOPMOST を false のままにして、他のフォームがメイン フォームを越えることができることです。
それは私の問題を完全に解決しました。
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.F11)
if (FormBorderStyle == FormBorderStyle.None)
{
FormBorderStyle = FormBorderStyle.Sizable;
WindowState = FormWindowState.Normal;
}
else
{
SuspendLayout();
FormBorderStyle = FormBorderStyle.None;
WindowState = FormWindowState.Maximized;
ResumeLayout();
}
}
私の知る限り、タスクバーは「タスクバーを他のウィンドウの上に置く」設定に基づいてウィンドウの上または下のいずれかにあります。(少なくとも、XP ではこのような表現になっています。) この設定を検出して、必要に応じて切り替えることができるかどうかを試してみてはいかがでしょうか。
次のようにフォームのサイズを変更し、Z オーダーの先頭に移動してみてください。
Rectangle screenRect = Screen.GetBounds(this);
this.Location = screenRect.Location;
this.Size = screenRect.Size;
this.BringToFront();