哪些窗体置顶得程序是怎么实现得?

窗口置顶即不允许其他窗口在我之上,比如微信聊天窗口中右上角的钉子按钮,确认后,普通窗口不能在他之上,但是也不是绝对的,同样具有置顶属性的窗口也能覆盖掉他,这些是通过WindowsApi中的SetWindowPos函数来完成。

SetWindowPos

更改子窗口、弹出窗口或顶级窗口的大小、位置和Z顺序。这些窗口是根据屏幕上的外观排序的。最顶部的窗口获得最高排名,并且是Z顺序中的第一个窗口。
在这里插入图片描述
参数有7个,但是实现置顶功能,只需要hWnd(要置顶窗口的句柄)、hWndInsertAfter(标识在z中的顺序)、uFlags(窗口的标志)。

hWndInsertAfter可以取值如下:
1.HWND_BOTTOM:值为1,将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。

2.HWND_NOTOPMOST:值为-2,将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。

3.HWND_TOP:值为0,将窗口置于Z序的顶部。

4.HWND_TOPMOST:值为-1,将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置

很显然要用到-1,

uFlags取值非常多,不列举了,但是要取 SWP_NOSIZE 和SWP_NOMOVE用来忽略参数 x、y、 cx、 cy,也就是忽略窗口的大小和位置,不然SetWindowPos会重新定义位置和大小,组合值用或运算来连接,SWP_NOSIZE值为1,SWP_NOMOVE值为2,即最后值1| 2=3。

拿vb做个例子,运行后,窗口会被置顶,他可以跑到其他被置顶的窗口上面,同样其他被置顶窗口也能在他之上。

Private Declare Function SetWindowPos Lib "user32.dll" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const SWP_SHOWWINDOW As Long = &H40
Private Const SWP_NOSIZE As Long = &H1
Private Const SWP_NOMOVE As Long = &H2
Private Const HWND_TOPMOST As Long = -1

Private Sub Form_Load()
SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
End Sub

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章