这是原来上计算机课写的一个小说阅读器,老师一来随时隐藏,嘿嘿
阅读界面

章节目录界面

Autohotkey源代码
#MaxMem, 4095 ;最大内存 4G
#NoTrayIcon ;不显示图标
DetectHiddenWindows, On ;检查隐藏窗口
CoordMode, Mouse, Relative ;鼠标坐标相对窗口
;创建章节目录显示窗口
Gui, Add, ListView, x0 y0 w300 h400 glist, idx|章节目录
Gui, Show, , 章节目录
WinHide, 章节目录 ;隐藏窗口
;第一次打开程序
IfNotExist, history.ini
{
MsgBox, 4096, 版本说明|What's new, 更新项目:`n1.增加窗口大小调整功能,可以全屏啦!`n2.在Win+H基础上增加Win+Z快速显示隐藏窗口。`n3.优化上一页算法。`n4.增加点击文本上半部分为【上一页】,下半部分为【下一页】的翻页功能。`n`n已知问题:`n调整窗口大小后,当时可能显示错位,翻页后正常。
FileSelectFile, file, , , 选择一本小说, (*.txt) ;选取文件
if file =
Reload
IniWrite, %file%, history.ini, history, file ;写入ini
WinShow, 章节目录 ;显示窗口
FileDelete, mulu.txt
LV_Delete() ;删除已有信息
SplashTextOn, 200, 20, 提示, 获取章节中,请稍候! ;悬浮窗口
FileRead, main, %file% ;读取文件
StringSplit, line, main, `n ;按行分割
idx = 0 ;初始变量
Loop
{
idx += 1
if idx > %line0% ;大于最大行
Break ;中断循环
var = % line%idx% ;获取当前行
if var <>
{
StringReplace, var, var, `r, , All ;替换回车
test := RegExMatch(var, ".*第.*(章|卷|回)\s.{1,40}") ;正则表达式匹配章节
if test = 1
{
LV_Add("",idx,var)
mulu = %mulu%%idx%,%var%`n ;追加变量
}
}
}
FileAppend, %mulu%, mulu.txt ;保存目录信息
SplashTextOff
}
Else
{
IniRead, file, history.ini, history, file ;读取ini中的文件名
FileRead, main, %file% ;读取文件
StringSplit, line, main, `n ;按行分割
MsgBox, 36, 询问, 是否继续阅读【%file%】?
IfMsgBox, No
{
FileDelete, history.ini
Reload
}
Else
{
WinShow, 章节目录
LV_Delete()
SplashTextOn, 200, 20, 提示, 获取章节中,请稍候!
FileRead, main, %file% ;读取目录信息
StringSplit, line, main, `n
Loop
{
FileReadLine, cc, mulu.txt, %A_Index%
if errorlevel
Break
if cc <>
{
StringSplit, st, cc, `,,
idx = %st1%
var = %st2%
LV_Add("",idx,var)
}
}
SplashTextOff
MsgBox, 36, 询问, 是否继续上次阅读位置?
IfMsgBox, Yes
{
FileRead, tail, tail.txt
IniRead, idx, history.ini, history, idx
FileRead, dis, dis.txt
goto, jx
}
}
}
Return
list:
;获取焦点行
FocusedRowNumber := LV_GetNext(0, "F")
if FocusedRowNumber
{
LV_GetText(index, FocusedRowNumber, 1) ;获取id
goto, show
}
Return
menu:
IfWinExist, 章节目录
{
WinHide, 阅读
WinShow, 章节目录
}
Return
jx: ;继续阅读
oldidx = %idx%
SplitPath, file, , , , name, 4 ;获取文件名
WinHide, 章节目录
IfWinNotExist, 阅读
{
Gui, 2:Add, Text, x0 y10 w270 h180 gtextbody vshow,
Gui, 2:Add, Text, x20 y190 w40 h20 glast vlast, 上一页
Gui, 2:Add, Text, x120 y190 w40 h20 gmenu vmenu, 目录
Gui, 2:Add, Text, x220 y190 w40 h20 gnext vnext, 下一页
Gui, 2:Add, Text, x0 y210 w270 h20 vbt, %name%
Gui, 2:Show, , 阅读
Gui, 2:Default
Gui, 2:+Resize
}
Else
WinShow, 阅读
GuiControl, 2:, show, %dis%
Return
show:
SplitPath, file, , , , name,
WinHide, 章节目录
IfWinNotExist, 阅读
{
Gui, 2:Add, Text, x0 y10 w270 h180 gtextbody vshow,
Gui, 2:Add, Text, x20 y190 w40 h20 glast vlast, 上一页
Gui, 2:Add, Text, x120 y190 w40 h20 gmenu vmenu, 目录
Gui, 2:Add, Text, x220 y190 w40 h20 gnext vnext, 下一页
Gui, 2:Add, Text, x0 y210 w270 h20 vbt, %name%
Gui, 2:Show, , 阅读
Gui, 2:Default
Gui, 2:+Resize
}
Else
WinShow, 阅读
add = 0
tail = % line%index%
idx = %index%
goto, display
Return
display:
oldidx = %idx%
dis =
y = 0
Loop
{
if A_Index > %sy%
{
GuiControl, 2:, show, %dis%
Break
}
if add = 1
{
idx += 1
tail = % line%idx%
}
test := RegExMatch(tail, ".*第.*(章|卷|回)\s.{1,40}")
if test = 1
GuiControl, 2:, bt, %name%-%tail%
StringLen, len, tail
if len < %sx% ;单行长度小于最大单行字数
{
dis = %dis%%tail%`n
add = 1
}
if len >= %sx% ;单行长度大于等于最大单行字数
{
stringLeft, cline, tail, %sx% ;截取范围内的
StringTrimLeft, tail, tail, %sx% ;范围外的
dis = %dis%%cline%`n
StringLen, len2, tail
if len2 < 1
add = 1
Else
add = 0
}
}
Return
~Left::
~Up::
last:
idx := oldidx-sy/2
StringGetPos, pos, idx, .
StringLeft, idx, idx, %pos%
tail =
goto, display
Return
~Right::
~Down::
next:
goto display
Return
GuiClose: ;主窗口关闭
ExitApp
2GuiClose: ;阅读窗口关闭
FileDelete, tail.txt
FileAppend, %tail%, tail.txt
IniWrite, %idx%, history.ini, history, idx
FileDelete, dis.txt
FileAppend, %dis%, dis.txt
IniWrite, %add%, history.ini, history, add
WinHide, 阅读
WinShow, 章节目录
Return
2GuiSize:
sx := A_GuiWidth/6
StringGetPos, pos, sx, .
StringLeft, sx, sx, %pos%
sx -= 1
sy := A_GuiHeight/12
StringGetPos, pos, sy, .
StringLeft, sy, sy, %pos%
sy -= 4
textw := A_GuiWidth
texth := (sy+1)*12
buttony := texth+10
menux := A_GuiWidth/2-20
nextx := A_GuiWidth-40
titley := texth+30
GuiControl, 2:Move, show, w%textw% h%texth%
GuiControl, 2:Move, last, y%buttony%
GuiControl, 2:Move, menu, x%menux% y%buttony%
GuiControl, 2:Move, next, x%nextx% y%buttony%
GuiControl, 2:Move, bt, y%titley%
Return
textbody:
MouseGetPos, clickx, clicky
updown := clicky/texth
if updown > 0.5
goto, next
if updown < 0.5
goto, last
Return
#z:: ;Win+Z快速隐藏
#h:: ;Win+H快速隐藏
IfWinActive, ahk_class AutoHotkeyGUI
WinHide, ahk_class AutoHotkeyGUI
Else
WinShow, ahk_class AutoHotkeyGUI
Return
60 queries in 1.786 seconds |