1.[AHK] 桌面图标显隐2.[AHK2] 轻松拖拽窗口3.[AHK2] 虚拟键盘4.[AHK2] 音量控制
5.[AHK2] 常用的Tooltip(封装常用方法)
6.[AHK2] 亮度控制7.[AHK2] 媒体管理8.[AHK] 区分^ScrollLock 和 ^Pause9.[AHK2] 窗口置顶管理10.[AHK2] 切换鼠标锁定11.[AHK2] 更改脚本初始代码12.[AHK2] 让终止符决定热字串13.[AHK2] 屏幕放大镜14.[AHK2] 实现简单的贴图工具15.[AHK2] 向对象原型添加属性和方法16.[AHK2] 合并使用#include的脚本17.[AHK2] 截图工具18.[AHK2] wt调用命令19.[AHK2] 不用结束符的热字串20.[AHK2] 获取文件资源管理器中的选中文件21.仓库在哪?22.[AHK2] 借助vlc设置桌面动态背景23.[AHK2] 取色与颜色表示转换24.[AHK2] 取色工具25.[AHK2] 如何解析ahk命令行26.[AHK2] 杂谈——抽象的ahk代码风格是怎么来的?27.[AHK2] 脚本间通信28.[AHK2] 将绝对路径导入转化为相对路径导入29.[AHK2] 实现自定义文件管理器右键菜单30.[AHK2] 控制窗口透明度开始
在实际使用ahk时,常常要使用tooltip提示程序的运行结果。
比如:
- 增加屏幕亮度后显示当前亮度;
- 锁定鼠标后提示鼠标已锁定;
- 提示Run的运行结果;
- ……
在最后需要使用SetTimer
指定几秒种后使用Tooltip ,,, [weight]
关闭tooltip。
这部分工作包括显示tooltip显然是可以封装的。
脚本
脚本方法设计为自动与手动两种方式:
- 静态方法ShowTip -> 显示指定文本并在指定时间后移除。
- 构造方法 -> 返回封装的对象,手动控制显示与销毁。
对于静态方法ShowTip有reuse参数,表示是否始终使用同一个Weight(20),即是否允许多个ToolTip。
使用
; 使用静态方法 Tip.ShowTip('hello') ; 默认4s后隐藏 ; 使用静态方法返回值 clear := Tip.ShowTip('hello') ; clear方法仅在reuse为ture时返回 Sleep(1000), clear() ; 1s后手动销毁 ; --- ; 使用构造方法 _t := Tip('hello') _t.Display() ; 显示 Sleep 1000 _t.Recycle() ; 销毁
通过此脚本可以不再烦恼Tip的显示问题。
代码
此脚本位于仓库ahk-lib/Tip.ahk
仓库:https://gitee.com/dkwd/ahk-lib.git
#Requires AutoHotkey v2.0 #Include extend\Set.ahk CoordMode 'ToolTip', 'Screen' class Tip { static pool := Set() __New(text, weight := 1, x := unset, y := unset) { MouseGetPos(&mx, &my) IsSet(x) || x := mx, IsSet(y) || y := my if weight < 1 or weight >= 20 throw Error('invalid weight') if Tip.pool.Has(weight) weight := this.GetAvailable() if !weight throw Error('no available') this.text := text, this.x := x, this.y := y, this.weight := weight Tip.pool.Add(weight) } GetAvailable() { index := 1 while Tip.pool.Has(index) index++ return index >= 20 ? 0 : index } Display() { ToolTip this.text, this.x, this.y, this.weight return this } Recycle() => (Tip.pool.Delete(this.weight), ToolTip(, , , this.weight)) static ShowTip(text, x := 100, y := 50, duration := 4000, reuse := true) { return reuse ? _setTimerRemoveSingleToolTip(text, x, y, duration) : _setTimerRemoveMultiToolTip(text, x, y, duration) _setTimerRemoveSingleToolTip(text, x, y, time) { static clear := (*) => ToolTip(, , , 20) if !text return clear() ToolTip text, x, y, 20 if !time return clear SetTimer clear, -time } _setTimerRemoveMultiToolTip(text, x, y, time) { if !text return t := Tip(text, , x, y), t.Display(), later := (*) => t.Recycle() SetTimer later, -time } } }
补充
下面是引入的外部脚本Set.ahk
,实际上直接使用Map就行。
#Requires AutoHotkey v2.0 #Include _Array.ahk class Set extends Map { __new(value*) { kv := [] value.foreach(v => kv.Push(v, 0)) super.__New(kv*) } Add(e*) { for v in e { if this.Has(v) return false super.Set(v, 0) } return true } Count => super.Count Has(e) => super.Has(e) Clear() => super.Clear() Delete(e) => super.Delete(e) }
UI版本
最近,我实现的使用ui的版本,相比于原生的api,自定义性更多了。
api与上面的完全一致。
效果如下:
(下面的是进度条)
脚本也在仓库中,具体代码如下:
; Tip.ahk 的ui版本 #Requires AutoHotkey v2.0 #Include Theme.ahk #Include util\Animation.ahk /* ; ======== 使用静态方法 DCon TipUI.ShowTip('halo'), &x, &y, &w, &h ; 可以解构出x,y,w,h,duration TipUI.ShowTip('xcatp', , y + h + 10) ; ======== 自己new t := TipUI('meow', 100, 100, 1000, Noop) t.Start() ; 开始 t.Stop() ; 内部使用的方法,调用后就停止了(无法恢复) t.Destroy() ; 销毁 */ class TipUI extends Gui { __New(text, x, y, duration, onRClick) { if duration <= 100 throw Error('必须大于100') super.__New('+AlwaysOnTop +ToolWindow -Caption +Border') this.SetFont('s13', 'consolas') this.AddText('Section x16 y5', text).GetPos(, , &w) this.AddText('xs y25 Backgroundffd500 h1 w' w) this.OnEvent('ContextMenu', onRClick) Theme.Dark(this), this.Show('hide'), this.GetPos(, , &w, &h) this.p := this.AddText('x0 y' h - 4 ' Backgroundff2323 h3 w' w) this.data := [x, y, w, h, duration] } Start() { DCon(this.data, &x, &y, &w, , &time), this.Show('NA x' x ' y' y) t := 100, i := 0, _w := w / t, _d := time / t SetTimer(d, _d), this.Stop := (*) => SetTimer(d, 0) return this.data d() { this.p.Move(, , w - _w * i), i++ if i >= t Animation.FadeOut(this) } } Destroy() => (this.Stop(), super.Destroy()) static ShowTip(text, x := 100, y := 50, duration := 4000, onRClick := Noop) => TipUI(text, x, y, duration, onRClick).Start() }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期