Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么赢了;全屏winform应用程序是否总是覆盖任务栏?_C#_.net_Winforms_Fullscreen_Keyboard Hook - Fatal编程技术网

C# 为什么赢了;全屏winform应用程序是否总是覆盖任务栏?

C# 为什么赢了;全屏winform应用程序是否总是覆盖任务栏?,c#,.net,winforms,fullscreen,keyboard-hook,C#,.net,Winforms,Fullscreen,Keyboard Hook,我使用的是WindowsVista和C#.NET3.5,但我让我的朋友在XP上运行这个程序,遇到了同样的问题 因此,我有一个C#程序,我在后台运行,系统托盘中有一个图标。我有一个低级键盘挂钩,所以当我按下两个键(本例中为Ctr+windows)时,它将拉出应用程序的主窗体。表单在组合键“按偶数”处理程序中设置为全屏: this.FormBorderStyle = FormBorderStyle.None; this.WindowState = FormWindowState.Maximized;

我使用的是WindowsVista和C#.NET3.5,但我让我的朋友在XP上运行这个程序,遇到了同样的问题

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

this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
所以它基本上是有效的。当我点击CTR+Windows时,无论我关注的是哪个程序,它都会显示表单。但有时候,任务栏仍然会显示在表单上,这是我不想要的。我希望当我按下组合键时,它总是全屏显示

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

有人知道我该怎么解决这个问题吗

编辑:更多详细信息- 我试图实现web浏览器在全屏模式或powerpoint演示模式下的效果

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


如果我的主窗口位于最上面,那么当我单击它时,其他窗口将落在后面,如果任务栏被隐藏,我不希望出现这种情况。

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

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

        Rectangle screenRect = Screen.GetBounds(this);
        this.Location = screenRect.Location;
        this.Size = screenRect.Size;
        this.BringToFront();
试试这个(其中
这个
是您的表单):


这会将窗体设置为全屏,并覆盖任务栏。

我尝试了很多解决方案,其中一些可以在Windows XP上运行,而所有的都不能在Windows 7上运行。毕竟我写了一个简单的方法来做到这一点

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();
        }
}
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的位置,代码的顺序将不起作用

这种方法的一个优点是将最上面的表单保留为false,从而允许其他表单覆盖主表单


这绝对解决了我的问题。

根据您的偏好更改用户选择的设置是一种不好的做法。最好了解如何使用API以正确的方式获得所需的行为。该设置仅适用于窗口应用程序,而不适用于全屏应用程序。因为当我玩游戏或将我的网络浏览器设置为全屏时,它会覆盖任务栏。像游戏这样的全屏应用程序正在将显示模式切换到DirectX或OpenGL或完全在窗口系统之外的其他模式,从而使程序可以访问原始视频缓冲区。这是在窗口系统中设置的,所以我提到的设置适用。为了实现这一点,你需要确保表单没有最大化。哦,唯一的问题是我不能让它处于最顶端,因为我有其他位于它上面的窗口是最顶端的,所以如果我点击“这个”,那么所有其他窗口都会在它后面。呵呵。那里的小细节。我怀疑如果用户选中了“将任务栏置于其他窗口之上”,是否可以在没有顶层的情况下完成您想要的操作。但是你也可以有多个最上面的窗口,而活动窗口将是,呃,最上面的测试。
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;
        }
    }