簡體   English   中英

將VB.Net窗口置於所有窗口的頂部

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM