[英]Bring VB.Net window on top of all windows
我有一個窗口應該保持在Power point幻燈片放映之上。 所以它應該在所有窗口之上。 我使用VB“user32”輕松地使用VB 6,但它似乎與VB.net不同。
Me.TopMost = True
這似乎不起作用,因為它只在程序中工作。
Private Declare Function BringWindowToTop Lib "user32" Alias "BringWindowToTop" (ByVal hwnd As Long) As Long
Private Sub frmTmr_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
BringWindowToTop(Me.Handle)
End Sub
這也會出錯! 任何幫助是極大的贊賞! 提前致謝,
問候
曼居拉
如果你想在你的應用程序的窗口總是出現在不同的應用程序的窗口的頂部,那么BringWindowToTop
函數絕對不是你想要的。 對於初學者,正如您所注意到的,您必須使用計時器重復調用該函數。 這應該是你的第一個線索,它是錯誤的API。 另一個問題是,它只會將窗口置於其進程的Z順序頂部,而不是系統上運行的所有其他進程。 正如文檔解釋的那樣,
調用此函數類似於調用
SetWindowPos
函數以Z順序更改窗口的位置。BringWindowToTop
不會使窗口成為頂級窗口。
最后一句應該表明有更好的方法。 Windows內置支持頂級窗口(即應始終顯示在其他窗口之上的窗口):這些窗口稱為最頂層的窗口。 這正是你想要的。 最頂層的窗口始終顯示在非最頂層的窗口上方。
Raymond Chen試圖在他的博客上解釋一些混亂。 請注意,在這種情況下, HWND_TOP
等同於BringWindowToTop
。 相反,你想要HWND_TOPMOST
。
制作窗口最頂層的最簡單方法是在創建窗口時指定WS_EX_TOPMOST
標志。 .NET Framework隱藏了幕后的大部分窗口創建工作,但您可以在需要時通過覆蓋窗體類的CreateParams
屬性來自定義參數。
以下是一些示例代碼,使表單始終位於最頂層:
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 / Invoke 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.