คุณเริ่มงานทุกวันแต่เช้าเพื่อที่คุณจะได้แก้ปัญหาทุกอย่างในระหว่างวันได้ เช็คนาฬิกาก็ตี 3 แล้ว แต่งานยังไม่เสร็จ แล้วเวลาหายไปไหน?
คุณสามารถใช้แอปติดตามเวลาโดยเฉพาะได้ แต่แอปเหล่านี้อาจซับซ้อนและน่าหงุดหงิดได้ ทำไมไม่สร้างแอปเล็กๆ ง่ายๆ ของคุณเองแทนล่ะ แอปพลิเคชันนี้สามารถติดตามหน้าต่างทั้งหมดที่คุณใช้ในระหว่างวัน คุณเพียงแค่ต้องมี AutoHotKey ซึ่งเป็นโปรแกรมประมวลผลคำพื้นฐานเช่น Notepad และใช้เวลาประมาณครึ่งชั่วโมง มาเริ่มกันเลย!
สร้างสคริปต์บันทึกหน้าต่างของคุณเองด้วย AutoHotKey
ก่อนเริ่มต้น คุณควรติดตั้ง AHK บนคอมพิวเตอร์ของคุณ เนื่องจากจะทำหน้าที่เป็น "พาร์เซอร์" สำหรับสคริปต์ เป็นเครื่องมือที่จะอนุญาตให้สคริปต์ของคุณ "ทำงาน"
หมายเหตุ : คุณยังสามารถคอมไพล์สคริปต์หลังจากเสร็จสิ้นเพื่อเปลี่ยนให้เป็นโปรแกรมปฏิบัติการจริงได้ อย่างไรก็ตาม นั่นอยู่นอกเหนือขอบเขตของบทความนี้
ดาวน์โหลด AutoHotKey จากเว็บไซต์อย่างเป็นทางการและติดตั้ง
เลือกใหม่ > สคริปต์ AutoHotKey
เปิดโปรแกรมจัดการไฟล์ที่คุณชื่นชอบและเข้าถึงโฟลเดอร์ที่คุณต้องการจัดเก็บสคริปต์ จากนั้นคลิกขวาที่ตำแหน่งว่างแล้วเลือกNew > AutoHotKey Script
เมื่อเสร็จแล้วก็ถึงเวลาเขียนสคริปต์จริง
1. ระบุตัวแปรที่จำเป็น
เปิดสคริปต์ในตัวแก้ไขที่คุณชื่นชอบ คุณสามารถใช้โปรแกรมง่ายๆ เช่น Notepad ที่มาพร้อมกับ Windows ได้ แต่บทความนี้จะใช้Notepad++ สำหรับบทช่วยสอนนี้ Notepad++ เป็นโปรแกรมฟรีและปรับแต่งมาเพื่อจุดประสงค์นี้ได้ดียิ่งขึ้น ดังนั้นคุณควรลองใช้ดู
โปรดทราบว่าคุณไม่ควรใช้แอปพลิเคชันใดๆ เช่น Word หรือ Google Docs ซึ่งอาจส่งผลต่อการจัดรูปแบบของสคริปต์ ใช้โปรแกรมแก้ไขข้อความหรือโค้ด
สคริปต์จะมีข้อมูลพื้นฐานที่แนะนำเกี่ยวกับความเข้ากันได้และประสิทธิภาพ ปล่อยไว้เหมือนเดิมและเริ่มสคริปต์ด้านล่าง
เริ่มต้นด้วย:
AppLoggingRate = 10 ; Time interval (in seconds) between active window title captures.
SleepTime := AppLoggingRate * 1000
LogPath = %A_ScriptDir%
LastActiveWindow =
เริ่มต้นด้วยการกำหนดค่า"10"ให้กับAppLoggingRateซึ่งจะใช้ในการคำนวณเวลาระหว่างความพยายามในการบันทึกหน้าต่าง
เมื่อใช้กับฟังก์ชัน Sleep ของ AHK ค่า 1,000 จะเท่ากับประมาณหนึ่งวินาที ดังนั้นด้วยการคูณด้วยAppLogingRateคุณจะสร้างตัวแปร SleepTime "เท่ากับ 10 วินาที"
LogPathเป็นเส้นทางที่ใช้จัดเก็บบันทึก ตัวอย่างกำลังใช้ค่า%A_ScriptDir%ซึ่งแปลเป็น "ไดเรกทอรีจากที่ที่คุณเรียกใช้สคริปต์" คุณสามารถใช้เส้นทางแบบเต็มไปยังโฟลเดอร์อื่นได้หากต้องการ
สุดท้าย ให้ตั้งค่าLastActiveWindowให้ว่างเปล่าและใช้ในภายหลังเพื่อตรวจสอบว่าหน้าต่างที่ใช้งานอยู่มีการเปลี่ยนแปลงหรือไม่
2. ตรวจสอบหน้าต่างที่ใช้งานอยู่
เนื่องจากเราต้องการติดตามอย่างต่อเนื่องว่าหน้าต่างใดทำงานอยู่ และหากมีการเปลี่ยนแปลง บันทึกชื่อและเวลา เราจึงต้องใช้ "วนซ้ำ"
ตามชื่อที่แนะนำ การวนซ้ำจะทำงานอย่างต่อเนื่อง โดยทำซ้ำฟังก์ชันเดียวกัน ด้วยไวยากรณ์ง่ายๆ ของ AHK ทำให้ "โค้ด" ต่อไปนี้ค่อนข้างเข้าใจง่าย:
Loop
{
Sleep %SleepTime%
Msgbox, It Works!
}
กำหนดลูปโดยเพียงพิมพ์คำว่า "loop" จากนั้นทำเครื่องหมายที่ขึ้นต้นด้วย"{"และลงท้ายด้วย"}"ทุกอย่างในบรรทัดระหว่าง"{"และ"}"จะทำงานตลอดไปจนกว่าคุณจะออกจากสคริปต์
เริ่มต้นการวนซ้ำโดยการรอ ( Sleep ) เป็นระยะเวลาเท่ากับตัวแปร SleepTimeตัวแปรนี้ทำให้การควบคุมเวลาง่ายขึ้น แทนที่จะแก้ไขสคริปต์ด้วยตัวเอง คุณสามารถ "บอก" สคริปต์ได้ว่าแต่ละวงควรใช้เวลากี่วินาทีผ่านตัวแปรนี้
สุดท้าย ใช้กล่องข้อความเพื่อทดสอบสคริปต์ ลองบันทึกและเรียกใช้ (ดับเบิลคลิกที่ไฟล์สคริปต์) คุณจะเห็นกล่องข้อความที่ระบุว่า"ใช้งานได้!" (การทำงานของสคริปต์) หลังจากผ่านไป 10 วินาที
คลิกขวาที่ไอคอนของ AHK ในถาด Windows และออกจากสคริปต์เมื่อคุณมีกล่องข้อความเพียงพอ จากนั้นกลับไปที่ตัวแก้ไขและแทนที่ บรรทัด 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. รูปแบบข้อมูล
ตอนนี้เราบันทึกเวลาในตัวแปรที่มีรูปแบบต่างกันสองตัว รวมถึงชื่อของหน้าต่างที่ใช้งานอยู่ อย่างไรก็ตาม มีปัญหาเล็กน้อย: ชื่อเรื่องของหน้าต่างอาจมีอักขระที่ไม่ต้องการด้วย คุณสามารถลบอักขระที่ไม่ใช่ตัวอักษรและตัวเลขทั้งหมดได้โดยใช้การรองรับ RegEx ของ AHK ���้วย:
LogWindow := Regexreplace(ActiveWindow, "[^a-zA-Z0-9]", " ")
ด้วยเหตุนี้ เรามา "ขอให้" AHK ลบอักขระทั้งหมดออกจากตัวแปร ActiveWindow ที่ไม่ตรงกับสิ่งที่อยู่ในวงเล็บ:
- ตัวพิมพ์เล็ก
- ตัวพิมพ์ใหญ่
- ตัวเลข
จากนั้นกำหนดผลลัพธ์ให้กับตัวแปร LogWindow
ล้างชื่อหน้าต่างที่ใช้งานอยู่ด้วย RegEx
เมื่อตั้งค่าตัวแปรทั้งหมดและข้อมูลอันมีค่าทั้งหมดที่รวบรวมไว้ ตอนนี้คุณก็พร้อมที่จะจัดรูปแบบไฟล์บันทึกและเนื้อหาแล้ว
LogFilename = %LogFilename%_AppLog.md
LogFile = %LogPath%\%LogFilename%
ก่อนหน้านี้ เราได้กำหนดวันที่ปัจจุบันให้กับตัวแปร LogFilenameดังนั้นสำหรับบรรทัดแรก ให้เพิ่ม"_AppLog.md"เข้ากับวันที่เพื่อใช้เป็นชื่อไฟล์
ตั้งชื่อไฟล์บันทึก
ในบรรทัดที่สอง ให้รวมตัวแปรLogPathซึ่งกำหนดไว้ที่จุดเริ่มต้นเป็นปลายทางสำหรับไฟล์บันทึกพร้อมกับชื่อไฟล์ การรวมกันคือชื่อพาธแบบเต็มของไฟล์บันทึก ซึ่งกำหนดให้กับตัวแปรLogFile
มากำหนดค่าที่เทียบเท่ากันของ"บรรทัดว่าง เวลา - ชื่อหน้าต่าง บรรทัดว่างอีกสองบรรทัด ตัวแบ่ง และบรรทัดว่างอีกบรรทัดเพื่อการวัดที่ดี"ให้กับตัวแปร FileContent
FileContent = `n%LogTime% - %LogWindow%`n`n- - -`n
- ตัวอักษร"n"บอกให้ AHK ขึ้นบรรทัดใหม่ (เทียบเท่ากับการกดEnterหนึ่งครั้ง)
- ขีดสามขีดจะปรากฏเป็นตัวคั่นเมื่อแสดงในโปรแกรมดูที่เข้ากันได้แบบ cross-down
- "% LogTime%"และ "% LogWindow%"เป็นตัวแปรที่เก็บชื่อของหน้าต่างที่ใช้งานอยู่และเวลาที่ตรวจพบ
กำหนดเนื้อหาของไฟล์บันทึก
5. อัพเดตไฟล์
คุณได้กำหนดสิ่งที่เราต้องการเขียนลงในไฟล์ รวมถึงเส้นทางและชื่อไฟล์ สิ่งที่เหลืออยู่คือข้อความจริงที่เรียบง่ายดังนี้:
FileAppend, %FileContent%, %LogFile%
ผนวกทุกอย่างใน ตัวแปร "FileContent"เข้ากับไฟล์ "LogFile"
ใช้ฟังก์ชันผนวกของ AHK เพื่ออัปเดตไฟล์บันทึกหรือสร้างใหม่ตั้งแต่ต้น
ฟังก์ชัน "ผนวก" จะเพิ่ม "FileContent" ลงในไฟล์หากมีอยู่ แต่จะสร้างใหม่ตั้งแต่ต้นหากไม่มีไฟล์อยู่
มีการปรับแต่งครั้งสุดท้าย: แทนที่เนื้อหาของ ตัวแปร LastActiveWindowด้วยหน้าต่างที่ใช้งานอยู่ในปัจจุบัน
แทรกชื่อของหน้าต่างที่ใช้งานปัจจุบันลงในตัวแปร LastActiveWindow สำหรับการทดสอบในอนาคต
เมื่อต้องการทำเช่นนี้ สคริปต์ควรจะสามารถตรวจพบการเปลี่ยนแปลงหน้าต่างถัดไปได้
LastActiveWindow = %ActiveWindow%
และด้วยการเพิ่มครั้งสุดท้าย ตัวบันทึกหน้าต่างก็พร้อมแล้ว! บันทึกสคริปต์และเรียกใช้ จากนั้นตรวจสอบไฟล์มาร์กดาวน์ ไฟล์นี้จะปรากฏในโฟลเดอร์ไฟล์สคริปต์หลังจากผ่านไป 10 วินาที
ไฟล์บันทึกของ Windows ถูกสร้างขึ้นในไดเร็กทอรีเดียวกันกับสคริปต์
ควบคุมเวลาของคุณเอง
คุณสามารถเปิดไฟล์บันทึกด้วยโปรแกรมแก้ไขข้อความใดก็ได้ อย่างไรก็ตาม มันจะดูดีขึ้นหากคุณเปิดมันในตัวแก้ไขที่เข้ากันได้กับมาร์กดาวน์ ในภาพหน้าจอ คุณสามารถดูบันทึกในตัวแก้ไข Typora ยอดนิยม
ไฟล์มาร์กดาวน์ที่สร้างโดยสคริปต์ถูกโหลดใน Typora
เป็นวิธีง่ายๆ ในการตรวจสอบว่าแอปใดที่คุณใช้บ่อยที่สุด และต้องใช้เพียงเครื่องมืออย่าง Notepad เท่านั้นจึงจะใช้งานได้
หากคุณต้องการอะไรที่ "พิเศษกว่านี้" คุณสามารถ "จัดรูปแบบ" เอาต์พุตของตัวบันทึกเพื่อสร้างไฟล์ 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