我有一个窗口应该保持在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
这也会出错! 任何帮助是极大的赞赏! 提前谢谢,
此致
曼居拉
答案 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