winforms 在不同分辨率的辅助屏幕上最大化表单?

7lrncoxx  于 2023-10-23  发布在  其他
关注(0)|答案(2)|浏览(134)

我正在开发一个简单的Windows应用程序(在C#),我希望它能显示在我的第二个显示器最大化的形式。为此,我在表单的“Load”事件上执行以下操作:

private void FormTest_Load(object sender, EventArgs e)
    {
        Screen[] screens = Screen.AllScreens;
        this.WindowState = FormWindowState.Normal;
        this.Location = screens[1].WorkingArea.Location;
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
        this.WindowState = FormWindowState.Maximized;                    
    }

我遇到的问题是,当我执行此操作时,表单只占用屏幕的一部分。我的主屏幕的分辨率为1024x768,我的副屏幕的分辨率为1920x1080,似乎该表单在我的副屏幕中占用了主屏幕的大小。
另外,我有一个按钮,它运行以下代码来最大化屏幕或将其恢复正常:

private void ChangeSize() {
    if (this.WindowState == System.Windows.Forms.FormWindowState.Maximized)
    {
        this.WindowState = System.Windows.Forms.FormWindowState.Normal;
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
    }
    else
    {
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
        this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
    }
}

当我点击按钮两次(第一次取消最大化表单,然后再次最大化它)时,表单确实完美地覆盖了整个辅助屏幕,但是如果我试图在“FormTest_Load”中的代码之后运行该函数两次(为了测试),屏幕仍然不会正确覆盖整个屏幕。
我可能犯了一个菜鸟的错误,但我已经为此挣扎了一段时间,所以我真的很感激,如果有人能阐明我的代码有什么问题。

amrnrhlw

amrnrhlw1#

我试图得到相同的结果,你描述(改变分辨率等),但所有的作品在我的电脑和屏幕上的罚款。变量screens到底是什么?我假设它是Screen.AllScreens,就像这样:

protected override void OnLoad(EventArgs e)
    {
        Screen[] screens = Screen.AllScreens;
        int screenNumber = 1;

        this.WindowState = FormWindowState.Normal;
        this.Location = screens[screenNumber].WorkingArea.Location;
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
        this.WindowState = FormWindowState.Maximized;
    }

就像我说的,它对我来说很好。此外,您还可以检查计算机的屏幕设置:文本和应用程序的大小是否设置为100% (recommended value)

ukqbszuj

ukqbszuj2#

我也遇到了同样的问题,只是第二台显示器的分辨率比第一台小。
唯一的解决办法是使用WinAPI:

[DllImport("user32.dll", SetLastError = true)]
    protected static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
    protected static readonly IntPtr HWND_TOP = new IntPtr(0);
    protected const UInt32 SWP_NOMOVE = 0x0002;
    
    private void FormTest_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Maximized)
        {
            Size size = Screen.FromControl(this).WorkingArea.Size;
    
            if (!Size.Equals(size))
            {
                SetWindowPos(Handle, HWND_TOP, 0, 0, size.Width, size.Height, SWP_NOMOVE);
            }
        }
        
    }

相关问题