将VB.Net窗口置于所有窗口的顶部

时间:2011-12-17 09:17:14

标签: vb.net winforms stayontop

我有一个窗口应该保持在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

这也会出错! 任何帮助是极大的赞赏! 提前谢谢,

此致

曼居拉

1 个答案:

答案 0 :(得分:12)

如果您希望 应用程序中的窗口始终显示在不同应用程序的窗口之上,那么BringWindowToTop函数肯定不是什么你要。对于初学者,正如您所注意到的,您必须使用计时器重复调用该函数。这应该是你的第一个线索,它是错误的API。另一个问题是,它只会将窗口置于其进程的Z顺序顶部,而不是系统上运行的所有其他进程。正如documentation所解释的那样,

  

调用此函数类似于调用SetWindowPos函数来更改Z顺序中窗口的位置。 BringWindowToTop不会将窗口设为顶级窗口。

最后一句话应该表明有更好的方法。 Windows内置支持顶级窗口(即应始终显示在其他窗口之上的窗口):这些窗口称为最顶层窗口。这正是你想要的。最顶层的窗口始终显示在非最顶层的窗口上方。

Raymond Chen试图解释一些混淆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 / Invoke SetWindowPos函数。 P / Invoke与您在VB6中使用Declare语句所做的类似,但是.NET世界的语义稍有改变 - 这就是为什么你不能使用旧的VB6 Declare语句在VB.NET中。

以下是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