该脚本实现了一个桌面便签工具,类似于Windows的便签应用,支持以下功能:
主要功能:
- 创建便签:
- 可以通过「新建」按钮创建新的便签窗口。
- 每个便签对应一个自动保存的文件(
.txt),以便后续恢复内容。
- 自动保存:
- 在便签中编辑的内容会自动保存到文件中(每隔5秒保存一次)。
- 如果内容为空并关闭便签窗口,会自动删除对应的文件。
- 恢复便签:
- 使用热键
F1打开脚本时会加载所有已经保存的便签文件。 - 如果没有便签,会自动创建一个新的便签。
- 使用热键
- 便签管理功能:
- 新建:创建一个新的便签窗口。
- 清空:清空当前便签内容。
- 撤销:撤销对便签内容的修改。
- 删除:关闭当前便签窗口。
- 便签布局与位置管理:
- 便签窗口可以拖动调整位置,每次新建窗口会偏移一定位置,避免重叠。
- 支持窗口的动态调整大小
; 简单的桌面便签 By FeiYue
;
; 用法:
; 1、按【F1】热键可以打开所有自动保存的便签
; 2、新建可以打开新便签,便签中的内容会自动保存到文件
; 3、关闭便签时会保存内容,内容为空会删除保存文件
F1:: Note("All")
Note(cmd="", id:="", args*)
{
static init, dir, arr, oldx, oldy, oldt, myrun, timer
ListLines, % (cmd="Timer") ? "Off" : A_ListLines
if (!VarSetCapacity(init) && init:="1")
{
dir:=A_Temp "\ahk_box\"
, arr:=[], oldx:=oldy:=oldt:=""
, myrun:=Func(A_ThisFunc).Bind("Run")
, timer:=Func(A_ThisFunc).Bind("Timer")
}
Switch cmd
{
Case "Timer":
clear:=[], Sec:=A_Sec//5
For id,v in arr
{
; 如果窗口被关闭,先保存一次再销毁窗口
DetectHiddenWindows, Off
if !WinExist("ahk_id " id)
{
Note("Save", id)
Gui, %id%: Destroy
clear[id]:=1
}
else
{
; 每隔5秒自动保存一次
if (oldt!=Sec)
Note("Save", id)
WinGetPos,,, w1, h1
ControlGetPos, x, y, w, h, Edit1
w2:=w1-x-x, h2:=h1-y-x
if (w!=w2 || h!=h2)
ControlMove, Edit1,,, w2, h2
}
}
oldt:=Sec
; 清理全局数组,如果全部清空就停止定时器
For id,v in clear
arr.Delete(id)
if arr.Count()<1
SetTimer,, Off
return
Case "Save":
DetectHiddenWindows, On
if !WinExist("ahk_id " id)
return
WinGetTitle, f
if !InStr(f, ".txt")
return
GuiControlGet, s, %id%:, Edit1
; 编辑框内容为空且窗口关闭,就删除磁盘文件
DetectHiddenWindows, Off
if (s="") && !WinExist("ahk_id " id)
{
FileDelete, % dir . f
arr[id][1]:=s
return
}
; 编辑框内容改变才写入磁盘文件
if (s!=arr[id][1])
{
arr[id][1]:=s
if !FileExist(dir)
FileCreateDir, % dir
file:=FileOpen(dir . f,"w"), file.Write(s), file.Close()
}
return
Case "Run":
k:=Trim(A_GuiControl)
if (k="新建")
Note()
else if (k="清空")
{
GuiControl, Focus, Edit1
ControlSend, Edit1, {Ctrl Down}a{Ctrl Up}{Del}
}
else if (k="撤销")
{
GuiControl, Focus, Edit1
ControlSend, Edit1, {Ctrl Down}z{Ctrl Up}
}
else if (k="删除")
{
GuiControl,, Edit1
Gui, Hide
}
return
Case "All":
i:=0
Loop Files, % dir "*.txt"
Note(RegExReplace(A_LoopFilePath, ".*\\")), i++
if (i=0)
Note()
return
}
; 确定自动保存的文件名
f:=cmd
if !InStr(f, ".txt")
{
Loop
f:=Format("{:03d}.txt", A_Index)
Until !FileExist(dir . f)
if !FileExist(dir)
FileCreateDir, % dir
FileAppend,, % dir . f
}
DetectHiddenWindows, Off
if WinExist(f . " ahk_class AutoHotkeyGUI", "清空")
return
; 备份默认GUI用于恢复
Gui, +Hwndold_id
; 创建新Gui
Gui, New, +AlwaysOnTop +LastFound +Hwndid +Resize +Owner -DPIScale
Gui, Margin, 0, 0
Gui, Font, s12
For k,v in StrSplit("新建|清空|撤销|删除", "|")
{
j:=(k=1) ? "":"x+0"
Gui, Add, Button, %j% h30 Hwndctrl_id, %v%
GuiControl, +g, %ctrl_id%, %myrun%
}
Gui, Add, Edit, xm w300 h150 -Wrap HScroll
FileRead, s, % dir . f
GuiControl,, Edit1, % s
Gui, Show, Hide, % f
WinGetPos, x, y, w, h
if (oldx="" || oldy="")
oldx:=x, oldy:=y
else
{
x:=Round(oldx)+30, y:=Round(oldy)+30
, (x>A_ScreenWidth-w || y>A_ScreenHeight-h)
&& (x:=0, y:=0), oldx:=x, oldy:=y
}
Gui, Show, % "x" x " y" y
GuiControl, Focus, Edit1
; 在全局数组中保留各个窗口的编辑框内容
GuiControlGet, s,, Edit1
arr[id]:=[s]
; 利用绑定函数来启动定时器
SetTimer, % timer, 100
; 恢复默认GUI
Gui, %old_id%: Default
}
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)