VB.Net窗口位于所有窗口之上



我有一个窗口,应该保持在ppt幻灯片的顶部。所以它应该在所有窗户的顶部。我使用VB 6使用Lib "user32"轻松地做到了这一点,但使用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

这也会给出一个错误!任何帮助都非常感谢!提前感谢,

Manjula

如果您希望应用程序中的窗口总是出现在不同应用程序的窗口顶部,那么BringWindowToTop函数绝对不是您想要的。对于初学者,正如您所注意到的,您必须使用计时器反复调用该函数。这应该是您的第一个线索,它是错误的API。另一个问题是,它只会将窗口移到其进程的Z顺序的顶部,而不是将系统上运行的所有其他进程都移到Z顺序的顶部。如文档所述,

调用这个函数类似于调用SetWindowPos函数来改变窗口在Z顺序上的位置。BringWindowToTop不使窗口成为顶级窗口。

最后一句话应该表明有更好的方法。Windows内置了对顶级窗口(即那些应该总是出现在其他窗口顶部的窗口)的支持:这些被称为top-most窗口。这正是你想要的。最上面的窗口总是出现在非最上面的窗口之上。

Raymond Chen试图在他的博客上解释一些困惑。注意,在这种情况下,HWND_TOP等同于BringWindowToTop。相反,您需要HWND_TOPMOST

使窗口最顶层的最简单方法是在创建窗口时指定WS_EX_TOPMOST标志。. net框架隐藏了大部分的窗口创建工作,但是你可以在需要的时候通过覆盖表单类的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的代码。净:

<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

相关内容

  • 没有找到相关文章

最新更新