vb6实现类似微信窗体置顶功能以及QQ截图钉在桌面上的功能

日期: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_BOTTOM1值为1,将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在其他窗口的底部。
HWND_NOTOPMOST-2值为-2,将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用。
HWND_TOP0值为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_FLAGS1SWP_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Commas.KM

码路共同进步,感恩一路有您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值