; Script written by Kal_Torak of AutoHotkey forums #Persistent #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. SendMode Input ; Recommended for new scripts due to its superior speed and reliability. start_time=0 LastSpacePress=0 StartOver=1 SpaceCount =0 #Hotstring B0 Paused=1 loop { if(start_time) sleep,500 TimeElapsedSinceSpacePress := A_TickCount - LastSpacePress if(SpaceCount>0) { if(TimeElapsedSinceSpacePress>1900) { TypingTime := A_TickCount - start_time if (paused) SaveStats(SpaceCount+1,TypingTime- TimeElapsedSinceSpacePress) StartOver=1 SpaceCount=0 } } } :*:mystats:: { WordsTyped=0 TimeTaken=0 i = 0 Loop { i++ FileReadLine, line, C:\TypingLog.txt, %i% if ErrorLevel break needle=| pipePos := InStr(line,"|",0,0) StringLeft, Words,line, pipePos StringLen, len, line StringRight, Time,line,len-pipePos WordsTyped+=Words TimeTaken+=Time } SetFormat, float, .2 ;msgbox,Words:%wordstyped%, time: %timetaken% TT:= TimeTaken/1000. TT:= TT/60 word := wordstyped/5 wpm:=word/TT MsgBox, Your WPM is %wpm%. You have typed %word% words in %TT% Minutes. return } :?*: :: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:a:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:b:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:c:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:d:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:e:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:f:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:g:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:h:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:i:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:j:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:k:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:l:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:m:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:n:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:o:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:p:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:q:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:r:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:s:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:t:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:u:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:v:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:w:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:x:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:y:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:z:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:1:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:2:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:3:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:4:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:5:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:6:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:7:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:8:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:9:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:0:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:!:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:@:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:#:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:$:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:%:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:^:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:&:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:*:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:(:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:):: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:_:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:-:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:+:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:=:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:[:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:]:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:;:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:':: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:,:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:.:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:/:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:\:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:{:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:}:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:|:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:<:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:":: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:>:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:?:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return :?*:~:: if (StartOver){ start_time := A_TickCount StartOver=0 } LastSpacePress := A_TickCount SpaceCount++ return SaveStats(WordsTyped,TimeTaken) { if (TimeTaken<1) return FileAppend,`n%WordsTyped%|%TimeTaken%, C:\TypingLog.txt } !^f:: { WordsTyped=0 TimeTaken=0 i = 0 Loop { i++ FileReadLine, line, C:\TypingLog.txt, %i% if ErrorLevel break needle=| pipePos := InStr(line,"|",0,0) StringLeft, Words,line, pipePos StringLen, len, line StringRight, Time,line,len-pipePos WordsTyped+=Words TimeTaken+=Time } SetFormat, float, .2 TT:= TimeTaken/1000. TT:= TT/60 word := wordstyped/5 wpm:=word/TT MsgBox,260,, Your WPM is %wpm%. You have typed %word% words in %TT% Minutes. Would you like to Reset? IfMsgBox Yes FileDelete,C:\TypingLog.txt return } !^o:: { if (paused) { Paused=0 SoundPlay, %A_WinDir%\Media\paused.wav return } else { Paused=1 SoundPlay, %A_WinDir%\Media\unpaused.wav return } }