使用 AutoHotKey 查找您在 Windows 上浪费时间的地方

您以最好的意图开始每一天,重新焕发活力,准备好处理您的所有任务。 然后,您查看时间,现在是凌晨 03:00,您不禁想知道,所有的时间都去哪儿了?

您可以使用专用的时间跟踪应用程序,但这些应用程序可能非常复杂。 另外,这其中的乐趣在哪里?

为什么不制作您自己的简单迷你应用程序,它可以跟踪您白天花费的所有时间? 你只需要 AutoHotKey,一个像记事本这样的基本文字处理器,大约半小时。 让我们陷入困境。

什么是 AutoHotKey?

AutoHotKey 的主要目的是桌面自动化。 它是一种脚本语言,您可以使用它向任何活动窗口发送击键和鼠标移动、创建热键或修改按键。 你可以,因为 example,用它来禁用键盘上的特定键。

然而,这只是故事的简短版本,并不能真正代表 AutoHotKey(简称 AHK)可以做什么。 那是因为它从最初的概念开始就已经发展,现在是一种完整的脚本语言。 你可以把你可以用它做的事情想象成“programming Lite”。

因此,您也可以使用 AHK 来创建迷你应用程序,就像我们为本文设定的目标一样。 请注意,在本文中,我们将直接深入了解 AHK,因此,在开始之前,您可能需要查看我们的快速 AutoHotKey 初学者指南。

使用 AutoHotKey 创建自己的窗口记录脚本

在我们开始之前,您应该在您的计算机上安装 AHK,因为它将充当您脚本的“解析器”。 它是允许您的脚本“运行”的“引擎”。

注意:您也可以在完成后编译您的脚本以将其转换为实际的可执行程序。 但是,这超出了本文的范围。

下载 AutoHotKey 从其官方网站 并安装它。

启动您最喜欢的文件管理器,然后访问您要存储脚本的文件夹。 然后,右键单击空白处,然后选择 新建 > AutoHotKey 脚本.

完成后,就该编写实际的脚本了。

1.定义必要的变量

在您喜欢的编辑器中打开脚本。 您可以使用像 Windows 附带的记事本这样简单的东西,但我们将使用 记事本++ 对于本指南。 由于 Notepad++ 是免费的,并且针对此目的进行了更好的定制,因此值得一试。 在检查时,请务必查看我们所有键盘快捷键的终极指南。

请注意,您不应使用任何应用程序,例如 Word或 Google Docs,这可能会影响其格式。 使用文本或“代码”编辑器。

该脚本已经包含一些推荐用于兼容性和性能的基础知识。 让它们保持原样,然后在它们下启动您的脚本。

从…开始:

AppLoggingRate = 10 ; Time interval (in seconds) between active window title captures.
SleepTime := AppLoggingRate * 1000
LogPath = %A_ScriptDir%
LastActiveWindow =

我们首先将值“10”分配给 AppLoggingRate,我们将使用它来计算捕获窗口标题之间的时间。

当与 AHK 的睡眠功能一起使用时,1000 大约等于一秒。 因此,通过将它与 AppLogingRate 相乘,我们使变量 SleepTime“等于 10 秒”。

LogPath 是我们要存储日志的路径。 我们正在使用值 %A_ScriptDir%,它转换为“运行脚本的文件夹”。 如果您愿意,可以使用另一个文件夹的完整路径。

最后,我们将 LastActiveWindow 设置为空白。 稍后我们将使用它来检查活动窗口是否已更改。

2.监控活动窗口

由于我们想持续跟踪哪个窗口处于活动状态,如果它发生变化,记录它的标题和时间,我们将不得不使用“循环”。

顾名思义,循环连续运行,重复相同的功能。 由于 AHK 的简单语法,我们相信以下“代码”相对不言自明:

Loop
{
Sleep %SleepTime%
Msgbox, It Works!
}

我们通过简单地输入单词“loop”然后用“{”标记它的开始并用“}”结束来定义一个循环。 “{”和“}”之间的行中的所有内容都将永久运行,直到您退出脚本。

我们通过等待 (Sleep) 与变量 SleepTime 相等的时间来开始循环。 我们在上一章将其设置为变量,以使控制时间更直接。 您可以通过这个变量“告诉”它每个循环应该持续多少秒,而不是编辑脚本本身。

最后,我们使用消息框来测试我们的脚本。 尝试保存并运行它(双击它的文件)。 您将看到一个消息框,说明“它有效!” 十秒钟后。

当您有足够的消息框时,右键单击 Windows 托盘中的 AHK 图标并退出脚本。 然后,返回到您的编辑器,并将 MsgBox 行替换为:

WinGetActiveTitle, ActiveWindow

这是获取活动窗口标题的命令。 忽略我们在编写测试脚本时使用的额外“StoreActiveWindow”行。

3.获取当前时间和名称

现在是脚本逻辑的核心部分。 我们希望它将活动窗口的名称与前一个窗口的名称进行比较,如果它们不同,则“做某事”。 就像下面这样简单:

If ActiveWindow != %LastActiveWindow%
{
}

使用上述内容,我们检查当前 ActiveWindow 是否不同于 (!=) 变量 LastActiveWindow 中存储的值(我们最初将其设置为空白)。 如果是,AHK 将执行 { 和 } 之间的代码,这些代码现在是空的。

我们需要跟踪日期和时间来衡量窗口活动的时间。 我们将使用他们名称中的日期为每一天保留不同的日志。 我们不仅要记录每个窗口更改,还要记录它发生的时间。 为此,我们将为变量 LogTime 和 LogFilename 分配不同的时间格式,其中:

FormatTime, LogTime,, HH:mm:ss
FormatTime, LogFilename,, yyyy-MMM-dd

在“If ActiveWindow…”下的大括号之间添加这些行,以便 AHK 在检测到窗口更改时运行它们。

4. 数据格式化

我们已经在两个不同格式的变量以及活动窗口的标题中获取了时间。 但是,有一个小问题:窗口的标题也可能包含我们不想要的字符。 我们可以使用 AHK 对 RegEx 的支持删除所有非字母数字字符,其中:

LogWindow := Regexreplace(ActiveWindow, "[^a-zA-Z0-9]", " ")

有了这个,我们“告诉” AHK 从 ActiveWindow 变量中删除所有与括号中的内容不匹配的字符:

  • 小写字母
  • 大写字母
  • 数字

然后,我们将结果分配给变量 LogWindow。

设置好所有变量并获取所有有价值的数据后,我们就可以格式化我们的日志文件及其内容了。

LogFilename = %LogFilename%_AppLog.md
LogFile = %LogPath%%LogFilename%

我们之前将当前日期分配给 LogFilename 变量。 因此,在第一行中,我们只是声明我们想要将“_AppLog.md”添加到日期以将其用作文件名。

在第二行中,我们将变量 LogPath(我们在开头定义为日志的目标)与文件名组合在一起。 它们的组合是分配给 LogFile 变量的日志的完整路径名。

让我们将“空行,时间 – 窗口名称,另外两个空行,一个分隔符和另一个空行,为了更好的衡量标准”分配给 FileContent 变量。

FileContent = `n%LogTime% - %LogWindow%`n`n- - -`n
  • “`n” 告诉 AHK 输入一个新行(相当于按 Enter 一次)。
  • 在 Markdown 兼容的查看器中显示时,三个破折号将显示为分隔线。
  • “%LogTime%”和“%LogWindow%”是我们存储活动窗口名称和检测时间的变量。

5. 更新文件

我们已经定义了要写入文件的内容,并且我们知道它的路径和文件名。 剩下的就是实际的写作,这很简单:

FileAppend, %FileContent%, %LogFile%

它几乎和简单的英语一样简单:我们将“FileContent”变量中的所有内容附加到文件“LogFile”中。

如果文件存在,“附加”功能会将“文件内容”添加到文件中,但如果不存在,也会从头开始创建它。

但是等等,还有最后一个调整:用当前活动的窗口替换 LastActiveWindow 变量的内容。

有了这个,脚本将能够检测到下一个窗口更改。

LastActiveWindow = %ActiveWindow%

最后添加后,您的窗口记录器就准备好了! Save 它,并运行它。 然后,查看 markdown 文件,十秒钟后该文件将出现在您的脚本文件的文件夹中。

掌握你的时间

您可以使用任何文本编辑器打开您的日志文件。 不过,如果您在兼容降价的编辑器中打开它,它看起来会更漂亮。 在屏幕截图中,您可以在流行的 Typora 编辑器中看到我们的日志。

这是一种检查您花费最多时间的应用程序的简单方法,并且您只需要像记事本这样的东西即可使用它。

如果您想要“更多”的东西,您可以随时“样式化”记录器的输出以生成 CSV 文件。 这就像调整 FileContent 变量和创建的文件的扩展名一样简单。 然后,您可以将此类文件导入到应用程序中,例如 Excel、Google Calc,甚至第三方时间跟踪器。

完整脚本:

#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn ; Enable warnings to assist with detecting common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
; Variables
; ---------
AppLoggingRate = 10 ; Time interval (in seconds) between active window title captures.
SleepTime := AppLoggingRate * 1000
LogPath = %A_ScriptDir%
LastActiveWindow =
; Logic
; -----
Loop
{
Sleep %SleepTime%

WinGetActiveTitle, ActiveWindow
StoreActiveWindow = %ActiveWindow%

If ActiveWindow != %LastActiveWindow%
{
FormatTime, LogTime,, HH:mm:ss
FormatTime, LogFilename, , yyyy-MM-dd

LogWindow := Regexreplace(ActiveWindow, "[^a-zA-Z0-9]", " ")

LogFilename = %LogFilename%_AppLog.md
LogFile = %LogPath%%LogFilename%

FileContent = `n%LogTime% - %LogWindow%`n`n- - -`n

sleep 50

FileAppend, %FileContent%, %LogFile%
LastActiveWindow = %ActiveWindow%
}
}
Exit