我有一個最小高度設置的表單,因爲我不想在「簡約顯示」模式下調整大小超出特定點的大小。從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