【问题标题】:Make WinForm form maximize to desktop height with multiple screens使用多个屏幕使 WinForm 表单最大化到桌面高度
【发布时间】:2017-04-11 11:51:55
【问题描述】:

我在 MS Windows 10 上的 MS VS2017 中有一个 VB.NET WinForm 程序,它的宽度受到限制,但它的高度应该与任何普通 Windows 应用程序相同。我有多个不同尺寸的显示器,这似乎与应用程序确定桌面高度的方式有关系。我应该注意,我的任务栏设置为在第二个屏幕上展开,但只出现在主屏幕上(但这似乎不会影响其他 Windows 应用程序的行为)。

我在Move 事件处理程序中使用以下代码(我也尝试覆盖WndProc,但没有运气),但表单在主屏幕上的任务栏后面最大化,即它占据了全屏高度,它应该占据全屏高度减去任务栏高度。但是,它确实会在辅助屏幕上最大化到正确的高度。

Private Sub form1_Move(sender As Object, e As EventArgs) _
    Handles MyBase.Move
    Me.MaximumSize = New Size(Me.MaximumSize.Width, _ 'fixed width
            My.Computer.Screen.Bounds.Height) 'screen height
End Sub

今天我尝试将行更改为:

    Me.MaximumSize = New Size(Me.MaximumSize.Width, _ 'fixed width
            My.Computer.Screen.FromControl(Me).WorkingArea.Height) 'screen height

但这现在会导致更复杂但仍然不正确的行为! (在辅助屏幕上不是全高)。我也尝试过使用SystemInformation.VirtualScreen.Height,但还是没有运气

获得正确高度的正确方法是什么?

这是描述的两个问题的图像,左侧是主显示器,表格最大化,高度将其一部分放置在任务栏后面,右侧是辅助显示器,最大高度没有高到足以填满没有任务栏的屏幕。如上所述,当在主监视器上最大化时,一些代码最终也导致表单甚至不符合任务栏。基本上我只是希望它像任何其他应用程序一样最大化,在任一监视器上正确地,有或没有任务栏,但宽度有限。

【问题讨论】:

  • 不要那样做,不好用,更多技术挑战。而是制作一个适当的多显示器应用程序,一个表格显示在 1 个屏幕上,另一个表格显示在屏幕 2 上。然后用户可以决定是否要分屏(WIN+左、右,如果他们只有 1 个显示器)或显示 1 个表格每个用于双显示器设置。如果他们有 3 台显示器,而您恰好有 3 个全屏表单选项(等等),这将很好地扩展。
  • @Neolisk 我想你误解了我的意思,我的意思是它应该只在单个屏幕上最大化作为一个正常的应用程序,只是它应该像正常一样最大化,即:没有任何额外的空间底部并且没有更改为意味着它的一部分位于任务栏后面的大小
  • 我以为您想在 2 个以上的屏幕上最大化。可以附上截图/模型来解释一下吗?
  • @Neolisk,按要求添加,希望清楚。
  • “移动事件处理程序”到底是什么?这个问题需要体面的重现代码才能去任何地方,需要包含设计时代码。

标签: .net vb.net winforms maximize


【解决方案1】:

查看 WM_GETMINMAXINFO 的文档,但是它在 .NET 中公开。

您可能还想查看WM_WINDOWPOSCHANGING 消息。

这两者都允许您控制窗口的大小。

【讨论】:

  • 罗杰,我对如何从 vb.net 访问 win APi 零概念......我已经尝试使用 Marshal.PtrToStructureMarshal.StructuretoPtr 使用 <StructLayout(LayouKind.Sequential)> 属性定义的结构,但得到访问冲突。有没有 MSDN 给我的 mumbo jumbo 的任何快速示例? :D
  • 我认为这与 .NET 中已经公开的内容相比没有任何优势。设置MaximumSize 填充将从WM_GETMINMAXINFO 处理程序报告的值,而WM_WINDOWPOSCHANGING 并不是真正有用,因为如果您可以为WM_GETMINMAXINFO 提供正确的值,则不需要它。我相信 OP 的问题是他们不知道如何计算最大高度,而不是无法将其传递给 Windows 管理器。
  • 再说一次,我什至不确定为什么 OP 甚至有这个问题。如果他们provide int.MaxValue for the height,则窗口管理器应该能够在任何屏幕上正确最大化窗口。
  • @GSerg,感谢 WRT WM_GETMAXINFO 的信息,我也开始这么想。至于int.MaxValue;这应该工作,但它没有。
【解决方案2】:

使用它会给你任务栏的最大高度

SystemParameters.WorkArea.Height

这篇文章也可能有帮助 full screen mode, but don't cover the taskbar

【讨论】:

  • 我的 VS2017 似乎无法识别 System.Windows.SystemParameters 并且它没有显示在可添加的框架参考中...是否需要添加一些安装?
  • 抱歉我这里没有 VS2017 link 它说它是 PresentationFramework 的一部分
  • 啊,我使用的是 WinForms,而不是 WPF(如问题标题)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2011-12-11
  • 2011-10-27
  • 2011-03-22
  • 1970-01-01
相关资源
最近更新 更多