【问题标题】:C# - Why won't a fullscreen winform app ALWAYS cover the taskbar?C# - 为什么全屏 Winform 应用程序不总是覆盖任务栏?
【发布时间】:2010-09-12 04:47:51
【问题描述】:

我使用的是 Windows Vista 和 C#.net 3.5,但我让我的朋友在 XP 上运行该程序时遇到了同样的问题。

所以我有一个在后台运行的 C# 程序,系统托盘中有一个图标。我有一个低级键盘钩子,所以当我按下两个键(在本例中为 Ctr+windows)时,它会拉出应用程序的主窗体。表单在组合按键事件处理程序中设置为全屏:

this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;

所以它基本上可以工作。当我点击 CTR+Windows 时,无论我关注什么程序,它都会弹出表单。但有时,任务栏仍会显示在表单上,​​这是我不想要的。我希望当我按下那个组合键时它总是全屏显示。

我认为这与应用程序最初的焦点有关。但即使当我点击我的主窗体时,任务栏有时也会停留在那里。所以我想知道焦点是否真的是问题所在。似乎有时任务栏很顽固,不想坐在我的程序后面。

有人知道如何解决这个问题吗?

编辑:更多细节- 我正在尝试实现与将网络浏览器置于全屏模式或将 powerpoint 置于演示模式时相同的效果。

在窗口窗体中,您可以通过将边框样式设置为无并最大化窗口来实现。但有时由于某种原因,窗口不会覆盖任务栏。一半的时间。

如果我将主窗口放在最上面,当我单击它时,其他窗口会落在它后面,如果任务栏被隐藏,我不希望这样做。

【问题讨论】:

    标签: c# .net winforms fullscreen keyboard-hook


    【解决方案1】:

    据我所知,根据“将任务栏保持在其他窗口之上”设置,任务栏位于窗口上方或下方。 (至少,这是 XP 中的措辞。)我想您可以尝试看看是否可以检测到此设置并在需要时切换它?

    【讨论】:

    • 根据您的偏好更改用户选择的设置是不好的做法。最好了解如何使用 API 以正确的方式获得所需的行为。
    • 该设置仅适用于窗口应用程序,不适用于全屏应用程序。因为当我玩游戏或将网络浏览器设置为全屏时,它会覆盖任务栏。
    • 游戏等全屏应用程序将显示模式切换为 DirectX 或 OpenGL 或完全在窗口系统之外的其他方式,从而为程序提供原始视频缓冲区访问权限。这是来自窗口系统,所以我提到的设置适用。
    【解决方案2】:

    尝试调整表单大小并将其置于 z 顺序的前面,如下所示:

            Rectangle screenRect = Screen.GetBounds(this);
            this.Location = screenRect.Location;
            this.Size = screenRect.Size;
            this.BringToFront();
    

    【讨论】:

      【解决方案3】:

      试试这个(this 是你的表单):

      this.Bounds = Screen.PrimaryScreen.Bounds;
      this.TopMost = true;
      

      这会将表单设置为全屏,并且会覆盖任务栏。

      【讨论】:

      • 为了让这个工作,你要确保表单没有最大化。
      • 哦,唯一的问题是我不能让它成为 TopMost,因为我上面还有其他窗口是 TopMost,所以如果我点击“这个”然后所有其他窗口会落后的。
      • 嘿。那里的小细节。如果用户选中了“将任务栏保持在其他窗口之上”,我怀疑您是否可以没有 TopMost 来完成您想要的操作。但您也可以有多个 TopMost 窗口,活动的窗口将是,呃,TopMostest。
      【解决方案4】:
      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();
              }
      }
      

      【讨论】:

        【解决方案5】:

        我尝试了很多解决方案,其中一些适用于 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 的位置将不起作用。

        这种方法的一个优点是让 TOPMOST 为 false,从而允许其他表单超越主表单。

        它绝对解决了我的问题。

        【讨论】:

          猜你喜欢
          • 2017-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多