如果你想在您應用程序的窗口總是出現在不同應用程序的窗口的頂部,則BringWindowToTop
功能絕對是不是你想要的。對於初學者,正如你所注意到的,你必須使用計時器反覆調用函數。這應該是你的第一個線索,它是錯誤的API。另一個問題是,它只會將窗口置於Z命令的頂部,而不是系統上運行的所有其他進程。作爲documentation解釋,
調用此功能類似於調用SetWindowPos
功能改變的Z順序窗口的位置。 BringWindowToTop
不會使窗口成爲頂層窗口。
最後一句應該說明有更好的辦法。 Windows已經內置了對頂級窗口的支持(即那些應該總是出現在其他窗口之上的窗口):這些窗口被稱爲最頂層的窗口。這正是你想要的。最頂層的窗口總是出現在非最頂層窗口的上方。
雷蒙德試圖解釋一些混淆on his blog。請注意,在這種情況下,HWND_TOP
相當於BringWindowToTop
。相反,你想要HWND_TOPMOST
。
製作窗口最簡單的方法是在創建窗口時指定WS_EX_TOPMOST
標誌。 .NET Framework在幕後隱藏了大部分窗口創建工作,但您可以在需要時通過覆蓋表單類的CreateParams
property來自定義參數。
下面是一些示例代碼,使表單總是最頂部:
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Const WS_EX_TOPMOST As Integer = &H00000008
Dim cp As CreateParams = MyBase.CreateParams
cp.ExStyle = cp.ExStyle Or WS_EX_TOPMOST
Return cp
End Get
End Property
,如果你想在運行時切換窗口的最頂部的狀態。這是行不通的。要做到這一點,你將不得不P /調用SetWindowPos
函數。 P/Invoke類似於你在VB6中用Declare
語句做的事情,但是對於.NET世界語義已經略有變化 - 這就是爲什麼你不能在VB.NET中使用舊的VB6 Declare
語句的原因。
下面是代碼可能是什麼樣子的VB.NET:
<DllImport("user32.dll", SetLastError:=True)> _
Private Shared Function SetWindowPos(ByVal hWnd As IntPtr, ByVal hWndInsertAfter As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal uFlags As Integer) As Boolean
End Function
Private Const SWP_NOSIZE As Integer = &H1
Private Const SWP_NOMOVE As Integer = &H2
Private Shared ReadOnly HWND_TOPMOST As New IntPtr(-1)
Private Shared ReadOnly HWND_NOTOPMOST As New IntPtr(-2)
Public Function MakeTopMost()
SetWindowPos(Me.Handle(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Function
Public Function MakeNormal()
SetWindowPos(Me.Handle(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
End Function
什麼錯誤,你能告訴我們你的使用調用API的Net代碼? –
聲明語句只適用於vb6。使用pinvoke.net找到正確的vb.net –