【发布时间】:2012-02-17 22:19:57
【问题描述】:
我有一个设置了最小高度的表单,因为当它处于“简约显示”模式时,我不希望它的大小超过某个点。
当用户尝试通过 Aero 将窗口对齐到屏幕顶部来最大化窗口时,窗口会最大化,但窗口的高度仅为 240 像素(设置的最大尺寸)。如果我在wParam 为SIZE_MAXIMIZED 时尝试处理WM_SIZE 消息,则任何设置表单高度的尝试都会被绕过。
目前我正在处理SC_MAXIMIZE 以检测何时按下最大化按钮,并处理WM_NCLBUTTONDBLCLK 以在用户双击标题栏时最大化窗口。在这两种情况下,我都可以切换扩展窗口模式并设置最小尺寸,使其能够全屏显示。
当然,如果通过ShowWindow(SW_MAXIMIZE) 最大化窗口或当aero 捕捉到屏幕顶部时,这些消息都不会发布。
在系统实际执行最大化操作之前,我是否可以处理另一条消息,以便我可以事先调整窗口大小和显示模式?
当前代码:
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而不是十六进制值? -
没有充分的理由,起初我只使用 2 条消息,所以我使用了这些值,而不是像我应该在我的应用程序中将它们定义为常量。
-
从 Windows 的角度来看,“窗口高度不得超过 Y 像素,除非用户想要使其更大,否则它可能会更大”的概念是愚蠢的。窗口高度限制为 Y 像素,或者不是。你不能同时拥有它。
-
既然你的全屏模式——再一次,从 Windows 的角度来看——与你的简约界面完全不同,你不能使用两个不同的窗口吗?
-
您无法完成这项工作,没有快照通知消息。您通过强迫用户使您的窗口看起来漂亮而陷入了这个问题。这是错误的做法,让用户负责。