日期:2022年06月20日
作者:Commas
注释:无论微信置顶功能,还是QQ截图钉在桌面上,本质上应该都是调用系统的API,将其窗体置前显示罢了,具体如何操作,请看下文。如果觉得有所帮助,帮忙点个赞支持一下,谢谢 ^ - ^
本文以VB6
作为演示,其它语言的也是差不多的操作的。
一、置顶 or 钉一下 的效果示例图
二、系统API之SetWindowPos的介绍
SetWindowPos
函数改变一个子窗口,弹出式窗口或顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。
Private Declare Function SetWindowPos Lib "user32" (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
-
hWnd
:在z序中的位于被置位的窗口前的窗口句柄,该参数必须为一个窗口句柄; -
hWndInsertAfter
:用于标识在z-顺序的此 CWnd 对象之前的 CWnd 对象。如果uFlags参数中设置了SWP_NOZORDER标记则本参数将被忽略。可为下列值之一:
参数 | 值 | 说明 |
---|---|---|
HWND_BOTTOM | 1 | 值为1,将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。 |
HWND_NOTOPMOST | -2 | 值为-2,将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。 |
HWND_TOP | 0 | 值为0,将窗口置于Z序的顶部。 |
HWND_TOPMOST | -1 | 值为-1,将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。 |
-
x
,y
,cx
,cy
参数说明:
x
:以客户坐标指定窗口新位置的左边界;
y
:以客户坐标指定窗口新位置的顶边界;
cx
:以像素指定窗口的新的宽度;
cy
:以像素指定窗口的新的高度; -
wFlags
:窗口尺寸和定位的标志。该参数可以是下列值的组合:
参数 | 值 | 说明 |
---|---|---|
SWP_FRAMECHANGED | &H20 | 给窗口发送WM_NCCALCSIZE消息,即使窗口尺寸没有改变也会发送该消息。如果未指定这个标志,只有在改变了窗口尺寸时才发送WM_NCCALCSIZE。 |
SWP_HIDEWINDOW | &H80 | 隐藏窗口。 |
SWP_NOACTIVATE | &H10 | 不激活窗口。如果未设置标志,则窗口被激活,并被设置到其他最高级窗口或非最高级组的顶部(根据参数hWndlnsertAfter设置)。 |
SWP_NOCOPYBITS | &H100 | 清除客户区的所有内容。如果未设置该标志,客户区的有效内容被保存并且在窗口尺寸更新和重定位后拷贝回客户区。 |
SWP_NOMOVE | &H2 | 维持当前位置(忽略x和y参数)。 |
SWP_NOOWNERZORDER | &H200 | 不改变z序中的所有者窗口的位置。 |
SWP_NOREDRAW | &H8 | 不重画改变的内容。如果设置了这个标志,则不发生任何重画动作。适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗回移动而露出的父窗口的所有部分。如果设置了这个标志,应用程序必须明确地使窗口无效并区重画窗口的任何部分和父窗口需要重画的部分。 |
SWP_NOREPOSITION | &H200 | 与SWP_NOOWNERZORDER标志相同。 |
SWP_NOSENDCHANGING | &H200 | 防止窗口接收WM_WINDOWPOSCHANGING消息。 |
SWP_NOSIZE | &H1 | 维持当前尺寸(忽略cx和Cy参数)。 |
SWP_NOZORDER | &H4 | 维持当前Z序(忽略hWndlnsertAfter参数)。 |
SWP_SHOWWINDOW | &H40 | 显示窗口。 |
TOPMOST_FLAGS1 | SWP_NOMOVE Or SWP_NOSIZE | 维持当前位置(忽略x和y参数),并且 维持当前尺寸(忽略cx和cy参数)。 |
三、VB6演示代码
窗体上放两个控件:
1、CommandButton
,将其命名为CmdNewForm
2、CheckBox
,将其命名为ChkTopForm
Option Explicit
'接口说明:=========================================
Private Declare Function SetWindowPos Lib "user32" (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
'(1)hWnd:在z序中的位于被置位的窗口前的窗口句柄,该参数必须为一个窗口句柄
'(2)hWndInsertAfter:用于标识在z-顺序的此 CWnd 对象之前的 CWnd 对象。如果uFlags参数中设置了SWP_NOZORDER标记则本参数将被忽略。可为下列值之一:
Private Enum e_hWndlnsertAfter
'值为1,将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。
HWND_BOTTOM = 1
'值为-2,将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。
HWND_NOTOPMOST = -2
'值为0,将窗口置于Z序的顶部。
HWND_TOP = 0
'值为-1,将窗口置于所有非顶层窗口之上。即使窗口未被激活窗口也将保持顶级位置。
HWND_TOPMOST = -1
End Enum
'(3)x,y,cx,cy参数说明
' x:以客户坐标指定窗口新位置的左边界
' y:以客户坐标指定窗口新位置的顶边界
'cx:以像素指定窗口的新的宽度
'cy:以像素指定窗口的新的高度
'(4)wFlags:窗口尺寸和定位的标志。该参数可以是下列值的组合:
Private Enum e_wFlags
' 给窗口发送WM_NCCALCSIZE消息,即使窗口尺寸没有改变也会发送该消息。如果未指定这个标志,只有在改变了窗口尺寸时才发送WM_NCCALCSIZE。
SWP_FRAMECHANGED = &H20
' 隐藏窗口。
SWP_HIDEWINDOW = &H80
' 不激活窗口。如果未设置标志,则窗口被激活,并被设置到其他最高级窗口或非最高级组的顶部(根据参数hWndlnsertAfter设置)。
SWP_NOACTIVATE = &H10
' 清除客户区的所有内容。如果未设置该标志,客户区的有效内容被保存并且在窗口尺寸更新和重定位后拷贝回客户区。
SWP_NOCOPYBITS = &H100
' 维持当前位置(忽略x和y参数)。
SWP_NOMOVE = &H2
' 不改变z序中的所有者窗口的位置。
SWP_NOOWNERZORDER = &H200
' 不重画改变的内容。如果设置了这个标志,则不发生任何重画动作。适用于客户区和非客户区(包括标题栏和滚动条)和任何由于窗回移动而露出的父窗口的所有部分。如果设置了这个标志,应用程序必须明确地使窗口无效并区重画窗口的任何部分和父窗口需要重画的部分。
SWP_NOREDRAW = &H8
' 与SWP_NOOWNERZORDER标志相同。
SWP_NOREPOSITION = &H200
' 防止窗口接收WM_WINDOWPOSCHANGING消息。
SWP_NOSENDCHANGING = &H200
' 维持当前尺寸(忽略cx和Cy参数)。
SWP_NOSIZE = &H1
' 维持当前Z序(忽略hWndlnsertAfter参数)。
SWP_NOZORDER = &H4
' 显示窗口。
SWP_SHOWWINDOW = &H40
' 维持当前位置(忽略x和y参数),并且 维持当前尺寸(忽略cx和cy参数)。
TOPMOST_FLAGS = SWP_NOMOVE Or SWP_NOSIZE
End Enum
'接口说明:=========================================
Private Sub ChkTopForm_Click()
On Error Resume Next
If Me.ChkTopForm.Value = 1 Then
SetWindowPos Me.hWnd, e_hWndlnsertAfter.HWND_TOPMOST, 0, 0, 0, 0, e_wFlags.TOPMOST_FLAGS
Else
SetWindowPos Me.hWnd, e_hWndlnsertAfter.HWND_NOTOPMOST, 0, 0, 0, 0, e_wFlags.TOPMOST_FLAGS
End If
End Sub
Private Sub CmdNewForm_Click()
On Error Resume Next
Dim f As New Form1
f.Caption = "新窗口"
Load f
f.Show 0
End Sub
本文参考:
1、《百度百科之SetWindowPos》
版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/125346839