Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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
.net 使用多个屏幕使WinForm窗体最大化到桌面高度_.net_Vb.net_Winforms_Maximize - Fatal编程技术网

.net 使用多个屏幕使WinForm窗体最大化到桌面高度

.net 使用多个屏幕使WinForm窗体最大化到桌面高度,.net,vb.net,winforms,maximize,.net,Vb.net,Winforms,Maximize,我在MS VS2017的MS Windows 10上有一个VB.NET WinForm程序,该程序的宽度受到限制,但其最大高度应与任何普通Windows应用程序相同。我有多个不同大小的显示器,这似乎在干扰应用程序如何确定桌面的高度。我应该注意,我的任务栏设置为不在第二个屏幕上展开,而只显示在主屏幕上(但这似乎不会影响其他Windows应用程序的行为) 我在Move事件处理程序中使用了以下代码(我也尝试过重写WndProc,但没有成功),但是表单在主屏幕上的任务栏后面最大化,即它占据了全屏高度,其

我在MS VS2017的MS Windows 10上有一个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
,但同样没有成功

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

这是所描述问题中的两个图像,左边是主监视器,窗体的最大化高度将其一部分放置在任务栏后面,右边是次监视器,最大化高度不足以填充没有任务栏的屏幕。如上所述,当在主监视器上最大化时,某些代码的表单甚至不符合任务栏。基本上,我只是想让它像任何其他应用程序一样最大化,在任何一个监视器上都正确,有或没有任务栏,但宽度有限。

查看
WM_GETMINMAXINFO
的文档,但是.NET中公开了这一点

您可能还想查看
WM\u WINDOWPOSCHANGING
消息


这两个选项都允许您控制窗口的大小。

使用这两个选项将为您提供任务栏的最大高度

系统参数。工作区。高度

这篇文章也会有所帮助

不要这样做,可用性差,技术挑战更多。而是制作一个适当的多监视器应用程序,一个窗体显示在1屏幕上,另一个窗体显示在2屏幕上。然后,用户可以决定是否要拆分屏幕(WIN+左、右,如果他们只有一个显示器),或者为双显示器设置在每个屏幕上显示一个表单。如果他们有3个显示器,而你恰好有3个全屏窗体选项(等等),那么这个功能就可以很好地扩展。@Neolisk我想你误解了我的意思,我的意思是,作为一个普通的应用程序,它只能在一个屏幕上最大化,只是它应该像普通应用程序一样最大化,ie:底部没有任何额外的空间,也没有改变尺寸,这意味着它的一部分在任务后面,barI认为你想在2+个屏幕上最大化。你能附上一个屏幕截图/模型来解释吗?@neolik,按要求添加,希望它是清楚的。“移动事件处理程序”到底是什么??这个问题需要合适的复制代码才能到达任何地方,需要包括设计时代码。My VS2017似乎无法识别
System.Windows.SystemParameters
,并且它不会显示在可添加的框架参考中。。。需要添加一些安装吗?抱歉,我这里没有VS2017,它说它是PresentationFramework的一部分啊,我使用的是WinForms,不是WPF(如标题所示)。罗杰,我不知道如何从vb.net访问win APi。。。我使用
Marshal.PtrToStructure
Marshal.StructuretoPtr
以及使用
属性定义的结构进行了尝试,但遇到了访问冲突。没有MSDN给我的那些乱七八糟的例子吗我不认为这比已经在.NET中公开的内容有任何优势。设置
MaximumSize
填充将从
WM\u GETMINMAXINFO
处理程序报告的值,而
WM\u WINDOWPOSCHANGING
并不是真正有用的,因为如果您可以为
WM\u GETMINMAXINFO
提供正确的值,则不需要它。我相信OP的问题在于他们不知道如何计算最大高度,而不是无法将其传递给windows管理器。再说一次,我甚至不知道OP为什么会有这个问题。如果是,windows管理器应该能够正确地最大化任何屏幕上的窗口。@GSerg,谢谢你提供的信息WRT WM_GETMAXINFO,我也开始这么想了。关于
int.MaxValue
;这应该行得通,但不行。@Toby实际上是这样的。你试过了吗?