这是原来上计算机课写的一个小说阅读器,老师一来随时隐藏,嘿嘿
阅读界面
章节目录界面
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 2.515 seconds |