本文已参与「新人创作礼」活动,一起开启掘金创作之路。
说明:
本案例基于clswindow开发的一个小软件,功能是方便的对目标窗口设置置顶还是取消置顶。软件启动后会在每个窗口的标题栏右端加一个置顶功能的小控制块。通常情况下点击它会使得对应的窗口置顶,如果要取消置顶可以再次点击一下。
测试环境:win7x64
提示: 在win10上可能有一些位置遮挡本身的最小化等按钮,后期会调整。
部分代码摘录:
说明: 以下是部分代码摘录,您会看到软件大量使用了SetTop等方法。完整代码可以从底部github获得,里面有直接的编译好的exe可以直接使用。
Private Sub addControlBox()
Dim w As New clsWindow, s$, v, i%
w.GetWindowByTitleEx ".+?", 0, s, True, , DisplayedWindow
v = Split(s, " ")
For i = 0 To UBound(v)
If v(i) <> Me.Hwnd Then
If Not isHasAddControlBox(v(i)) Then
w.Hwnd = v(i)
If InStr("|SetWindowTop|Program Manager|", "|" & w.Caption & "|") = 0 Then
lngHandleHwnd = w.Hwnd
Call createControlWindow
End If
End If
End If
Next
End Sub
.
.
.
Private Sub setTagPos()
isClickHandle = True
wTag.SetTop Not wTag.IsTopmost
Set Image1.Picture = IIf(wTag.IsTopmost, imgAfter.Picture, imgBefore.Picture)
If wTag.IsTopmost Then
wTag.SetTop
wTag.Focus
wMe.SetTop
End If
wTag.Focus
End Sub
Private Sub Timer1_Timer()
If Not wTag.CheckWindow Then '如果窗口不存在就关闭
Unload Me
End If
If wTag.IsForegroundWindow Then '如果当前是活动窗口,那么需要显示并移动控制窗口
lngLeft = (wTag.Left + wTag.Width) * 15 - Me.Width - 60 * 15
lngTop = wTag.Top * 15 + 60
If Me.Left <> lngLeft Or Me.Top <> lngTop Then '位置需要更新时再移动
Me.Move lngLeft, lngTop
End If
Me.Visible = True
wMe.SetTop
ElseIf Not wMe.IsForegroundWindow Then
Me.Visible = False
End If
If wTag.IsTopmost <> isTop Then
isTop = Not isTop
Set Image1.Picture = IIf(isTop, imgAfter.Picture, imgBefore.Picture)
End If
End Sub
点击下变成置顶,并且图标发生变化:
如果要退出可以点击右下角托盘,选择菜单“退出”
软件及源码下载
软件下载: github.com/sysdzw/SetW…
源码(github): github.com/sysdzw/SetW…