我有一个最小高度设置的表单,因为我不想在“简约显示”模式下调整大小超出特定点的大小。从WM_SIZE消息更改表单大小
当用户尝试通过Aero将窗口最大化并将其捕捉到屏幕顶部时,窗口被最大化,但窗口的高度仅为240像素(设置的最大尺寸)。如果我在wParam
为SIZE_MAXIMIZED
时尝试处理WM_SIZE
消息,则绕过了设置表单高度的任何尝试。
目前我正在处理SC_MAXIMIZE
来检测何时按下最大化按钮,并且WM_NCLBUTTONDBLCLK
如果用户双击标题栏以最大化窗口。在这两种情况下,我都可以切换扩展窗口模式并设置最小尺寸,以便能够全屏显示。
当然,如果窗口通过ShowWindow(SW_MAXIMIZE)
最大化或者当屏幕上出现aero-snap时,这些消息都不会发布。
我能处理的另一个消息是在系统实际进行最大化之前发生的,所以我可以事先调整窗口大小和显示模式?
目前代码:
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0112) { // WM_SYSCOMMAND
if (m.WParam == new IntPtr(0xF030)) { // Maximize event - SC_MAXIMIZE from Winuser.h
// The window is being maximized
this.MaximumSize = new Size(9999, 9999);
ToggleDeviceDisplay(true);
linkToggleDeviceList.Visible = false;
}
} else if (m.Msg == 0x00A3) { // WM_NCLBUTTONDBLCLK - Double clicking on window title bar, min or max
if (this.WindowState == FormWindowState.Normal) {
if (grpDeviceList.Visible == false) {
this.MaximumSize = new Size(9999, 9999);
ToggleDeviceDisplay(true);
}
this.WindowState = FormWindowState.Maximized;
linkToggleDeviceList.Visible = false;
} else {
this.WindowState = FormWindowState.Normal;
linkToggleDeviceList.Visible = true;
}
return;
} else if (m.Msg == 0x0005) { // WM_SIZE
if (m.WParam == new IntPtr(0x02)) { // SIZE_MAXIMIZED
// CANT GET WINDOW TO GO TO FULL-SCREEN FROM HERE
this.MaximumSize = new Size(9999, 9999);
// THE LINE BELOW DOESN'T WORK, probably because it is already being sized
this.Height = Screen.FromHandle(this.Handle).WorkingArea.Size.Height;
} else if (m.WParam == new IntPtr(0x00)) { // SIZE_RESTORED
linkToggleDeviceList.Visible = true;
}
}
base.WndProc(ref m);
}
如果窗口已经处于当WM_SIZE最大限度地发送扩展显示模式,是没有问题的,因为最大窗口大小设置为允许全屏,但是,如果他们试图从最小模式最大化,我不能让应用程序切换到消息过程中占用全屏。
我知道我可以触发一个计时器或从消息中运行的东西,所以它会很快调整大小,用户不会立即注意到它不是全屏,但这只是一个可怕的破解。
编辑:
为了说明这两个窗口状态,我已经上传两张截图here。顶部图像显示扩展显示,对窗口大小没有限制,底部图像显示最小显示,它具有高度限制设置,因此它们无法增加窗口的高度,因为它只会显示更多的空白空间。
谢谢。
为什么不使用实际的窗口消息常量值,比如'WM_SIZE'而不是十六进制值? – kprobst 2012-02-17 22:48:33
没有什么好的理由,起初我只使用2条消息,所以我使用了这些值,而不是像我应该那样在应用中定义它们。 – drew010 2012-02-17 22:53:01
从Windows的角度来看,“窗口高度不得超过Y像素,除非用户希望使其更大,然后可能更大”的概念是愚蠢的。窗口高度限制为Y像素,否则不是。你不能两面都有。 – hvd 2012-02-18 00:06:46