訣竅是獲取HwndSource並調用其AddHook()方法。這工作:
Imports System.Windows.Interop
Class Window1
Protected Overrides Sub OnSourceInitialized(ByVal e As System.EventArgs)
MyBase.OnSourceInitialized(e)
DirectCast(PresentationSource.FromVisual(Me), HwndSource).AddHook(AddressOf WndProc)
End Sub
Private Const WM_SYSCOMMAND As Integer = &H112
Private Const SC_MAXIMIZE As Integer = &HF030
Private Function WndProc(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wp As IntPtr, ByVal lp As IntPtr, ByRef handled As Boolean) As IntPtr
If msg = WM_SYSCOMMAND AndAlso wp.ToInt32() = SC_MAXIMIZE Then
Me.ResizeMode = ResizeMode.NoResize
Me.WindowStyle = WindowStyle.None
Me.WindowState = WindowState.Maximized
handled = True
End If
End Function
End Class
爲一個WinForms形式的相同代碼:
Public Class Form1
Private Const WM_SYSCOMMAND As Integer = &H112
Private Const SC_MAXIMIZE As Integer = &HF030
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = WM_SYSCOMMAND AndAlso m.WParam.ToInt32() = SC_MAXIMIZE Then
Me.FormBorderStyle = FormBorderStyle.None
Me.WindowState = FormWindowState.Maximized
Return
End If
MyBase.WndProc(m)
End Sub
Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
'' Restore window when the user presses Escape
If Me.WindowState = FormWindowState.Maximized AndAlso keyData = Keys.Escape Then
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.Sizable
Me.WindowState = FormWindowState.Normal
End If
Return MyBase.ProcessCmdKey(msg, keyData)
End Function
End Class
謝謝,這是接近。但是當我運行該代碼時,Windows任務欄仍然存在。 – giodamelio 2011-01-10 18:21:12
任務欄有時會顯示一兩秒鐘,但會消失。 (我不確定是什麼導致它暫時徘徊。) – JYelton 2011-01-10 18:35:54