04/12/2021

Cách tạo ứng dụng theo dõi thời gian trên Windows với AutoHotKey

Cách tạo ứng dụng theo dõi thời gian trên Windows với AutoHotKey

Bạn bắt đầu công việc mỗi ngày sớm để có thể xử lý mọi việc trong ngày. Sau đó, bạn kiểm tra đồng hồ, đã 3 giờ sáng nhưng công việc vẫn chưa xong. Vậy thời gian đã trôi đi đâu?

Bạn có thể sử dụng một ứng dụng theo dõi thời gian chuyên dụng, nhưng những ứng dụng này có thể phức tạp và gây khó chịu. Thay vào đó, tại sao không tạo một ứng dụng nhỏ đơn giản của riêng bạn? Ứng dụng này có thể theo dõi tất cả các cửa sổ bạn đã sử dụng trong ngày. Bạn chỉ cần AutoHotKey, một trình xử lý văn bản cơ bản như Notepad, và khoảng nửa giờ. Bắt đầu nào!

Tạo tập lệnh ghi nhật ký cửa sổ của riêng bạn với AutoHotKey

Trước khi bắt đầu, bạn nên cài đặt AHK trên máy tính của mình vì nó sẽ hoạt động như “phân tích cú pháp” cho kịch bản. Đó là công cụ sẽ cho phép tập lệnh của bạn “chạy”.

Lưu ý: Bạn cũng có thể biên dịch tập lệnh sau khi hoàn tất để biến nó thành một tập lệnh thực thi. Tuy nhiên, điều đó nằm ngoài phạm vi của bài viết này.

Tải xuống AutoHotKey từ trang web chính thức và cài đặt nó.

Chọn Mới> Tập lệnh AutoHotKey” chiều rộng =”650″ chiều cao =”388″ lớp học =”lười biếng” data-src =”https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-1.jpg”/> Chọn Mới> Tập lệnh AutoHotKey</p>
<p>Kích hoạt trình quản lý tệp yêu thích của bạn và chuyển đến thư mục mà bạn muốn lưu trữ tập lệnh.  Sau đó, nhấp chuột phải vào vị trí trống và chọn Mới> Tập lệnh AutoHotKey.</p>
<p>Sau khi hoàn thành, đã đến lúc viết kịch bản thực tế.</p>
<h3>1. Xác định các biến bắt buộc</h3>
<p>Mở tập lệnh trong trình chỉnh sửa yêu thích của bạn.  Bạn có thể sử dụng một cái gì đó đơn giản như Notepad đi kèm với Windows, nhưng bài viết sẽ sử dụng Notepad ++ cho hướng dẫn này.  Notepad ++ miễn phí và được điều chỉnh tốt hơn cho mục đích này, vì vậy bạn nên dùng thử.</p>
<p>Lưu ý rằng bạn không nên sử dụng bất kỳ ứng dụng nào như Word hoặc Google Docs, điều này có thể ảnh hưởng đến định dạng của script.  Sử dụng trình soạn thảo văn bản hoặc mã.</p>
<p>Tập lệnh sẽ chứa một số thông tin khuyến nghị cơ bản về khả năng tương thích và hiệu suất.  Để nguyên chúng và bắt đầu đoạn script bên dưới.</p>
<p>Bắt đầu với:</p>
<p>AppLoggingRate = 10;  Khoảng thời gian (tính bằng giây) giữa các lần chụp tiêu đề cửa sổ đang hoạt động.  SleepTime: = AppLoggingRate * 1000 LogPath =% A_ScriptDir% LastActiveWindow =</p>
<p>Bắt đầu bằng cách gán giá trị “10” thành AppLoggingRate, sẽ được sử dụng để tính toán thời gian giữa các cửa sổ ghi nhật ký.</p>
<p>Khi được sử dụng với chức năng Ngủ của AHK, 1000 chỉ gần một giây.  Vì vậy, bằng cách nhân nó với AppLogingRate, bạn sẽ tạo ra biến SleepTime “bằng 10 giây”.</p>
<p>LogPath là đường dẫn được sử dụng để lưu trữ các bản ghi.  Ví dụ đang sử dụng giá trị% A_ScriptDir%, được dịch sang “thư mục từ nơi bạn chạy tập lệnh”.  Bạn có thể sử dụng đường dẫn đầy đủ đến một thư mục khác nếu muốn.</p>
<div style=

Cuối cùng, đặt LastActiveWindow thành trống và sử dụng phần sau để kiểm tra xem cửa sổ đang hoạt động có thay đổi hay không.

2. Giám sát các cửa sổ đang hoạt động

Vì chúng tôi muốn liên tục theo dõi cửa sổ nào đang hoạt động và nếu nó thay đổi, hãy ghi lại tiêu đề và thời gian, chúng tôi sẽ phải sử dụng “vòng”.

Như tên cho thấy, một vòng lặp chạy liên tục, lặp lại cùng một (các) chức năng. Nhờ cú pháp đơn giản của AHK, như sau “mã số” tương đối dễ hiểu:

Vòng lặp {Sleep% SleepTime% Msgbox, Nó hoạt động! }

Xác định một vòng lặp bằng cách chỉ cần gõ từ “vòng” và sau đó đánh dấu sự khởi đầu của nó bằng “{” và kết thúc bằng “}”. Bất cứ điều gì trên ranh giới giữa “{” và “}” sẽ chạy mãi mãi cho đến khi bạn thoát khỏi tập lệnh.

Bắt đầu vòng lặp bằng cách đợi (Sleep) trong một khoảng thời gian bằng với biến SleepTime. Biến này giúp kiểm soát thời gian đơn giản hơn. Thay vì chỉnh sửa tập lệnh theo cách thủ công, bạn có thể “noi” nó, thông qua biến này, mỗi vòng lặp sẽ kéo dài bao nhiêu giây.

Cuối cùng, sử dụng Hộp thư để kiểm tra tập lệnh. Hãy thử lưu và chạy nó (nhấp đúp vào tệp script). Bạn sẽ thấy một hộp thông báo cho biết “Nó hoạt động!” (tập lệnh đang hoạt động) sau 10 giây.

Nhấp chuột phải vào biểu tượng AHK trong khay Windows và thoát tập lệnh khi bạn có đủ hộp thông báo. Sau đó quay lại trình chỉnh sửa và thay thế dòng MsgBox bằng:

WinGetActiveTitle, ActiveWindow

Đây là lệnh lấy tiêu đề của cửa sổ đang hoạt động. Bỏ qua phần thừa “StoreActiveWindow” dòng mà ví dụ đã sử dụng trong khi viết tập lệnh thử nghiệm.

Lấy tiêu đề của cửa sổ đang hoạt động và lưu trữ nó trong một biếnLấy tiêu đề của cửa sổ đang hoạt động và lưu trữ nó trong một biến

3. Nhận thời gian hiện tại và tên

Bây giờ là cốt lõi của logic script. So sánh tên của cửa sổ đang hoạt động với tên trước đó và nếu chúng khác nhau, “làm việc gì đó”. Mọi thứ đơn giản như sau:

Nếu ActiveWindow! =% LastActiveWindow% {}

Với những điều trên, hãy kiểm tra xem ActiveWindow hiện tại có khác (! =) Với giá trị được lưu trữ trong biến LastActiveWindow (ban đầu được đặt thành trống) hay không. Nếu vậy, AHK sẽ thực thi mã giữa {và}, mã này hiện đang trống.

Đặt chức năng để so sánh tiêu đề của cửa sổ đang hoạt động và cửa sổ trước đóĐặt chức năng để so sánh tiêu đề của cửa sổ đang hoạt động và cửa sổ trước đó

Cả ngày và giờ đều cần thiết để đo thời gian hoạt động của một cửa sổ. Các bản ghi khác nhau cho mỗi ngày, sử dụng ngày trong tên của họ sẽ được lưu giữ. Không chỉ mọi thay đổi mà khi nó xảy ra cũng sẽ được ghi lại. Để làm điều đó, hãy gán các định dạng thời gian khác nhau cho các biến LogTime và LogFilename, với:

See also  Chơi trò chơi di động trên web với Bluestacks X

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

Thêm các dòng đó giữa các dấu ngoặc nhọn trong “Nếu ActiveWindow …”, để AHK chạy chúng khi phát hiện thay đổi cửa sổ.

Lấy thời gian hiện tại và gán nó ở hai biến có định dạng khác nhauLấy thời gian hiện tại và gán nó ở hai biến có định dạng khác nhau

4. Định dạng dữ liệu

Bây giờ chúng tôi đã nắm bắt thời gian trong hai biến được định dạng khác nhau, cũng như tiêu đề của cửa sổ đang hoạt động. Tuy nhiên, có một vấn đề nhỏ: Tiêu đề của cửa sổ cũng có thể chứa các ký tự không mong muốn. Tất cả các ký tự không phải chữ và số có thể được xóa bằng cách sử dụng hỗ trợ của AHK cho RegEx, với:

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

Với cái này, “hỏi” AHK để xóa tất cả các ký tự khỏi biến ActiveWindow không khớp với những gì trong dấu ngoặc:

Chữ thường Chữ cái đầu số

Sau đó gán kết quả cho biến LogWindow.

Dọn dẹp tiêu đề của cửa sổ đang hoạt động với RegExDọn dẹp tiêu đề của cửa sổ đang hoạt động với RegEx

Với tất cả các biến được đặt và tất cả dữ liệu có giá trị được thu thập, giờ đây bạn đã sẵn sàng để định dạng tệp nhật ký và nội dung của nó.

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

Trước đây, chúng tôi đã gán ngày hiện tại cho biến LogFilename. Vì vậy, đối với dòng đầu tiên, hãy thêm “_AppLog.md” đến ngày để sử dụng nó làm tên tệp.

Đặt tên tệp nhật kýĐặt tên tệp nhật ký

Trong dòng thứ hai, kết hợp biến LogPath, được chỉ định ở đầu làm đích cho tệp nhật ký được liên kết với tên tệp. Sự kết hợp của chúng là tên đường dẫn đầy đủ của tệp nhật ký, được gán cho biến LogFile.

Gán tương đương với “dòng trống, Thời gian – Tên cửa sổ, thêm hai dòng trống, một dải phân cách và một dòng trống khác, để đo lường tốt” vào biến FileContent.

FileContent = `n% LogTime% -% LogWindow%` n`n- – -`nThe letter “n” yêu cầu AHK nhập một dòng mới (tương đương với việc nhấn Enter một lần). Ba dấu gạch ngang sẽ xuất hiện dưới dạng một dấu phân cách khi được hiển thị trong trình xem tương thích hướng xuống.” %Thời gian đăng nhập%” và “% LogWindow%” là các biến đã lưu trữ tên của cửa sổ đang hoạt động và thời gian nó được phát hiện.Xác định nội dung của tệp nhật kýXác định nội dung của tệp nhật ký

5. Cập nhật tệp

Bạn đã chỉ định những gì chúng tôi muốn ghi vào tệp, cũng như đường dẫn và tên tệp của nó. Tất cả những gì còn lại là văn bản thực tế, đơn giản như sau:

See also  Các tính năng và thiết bị mới được nâng cấp lên Android 12 beta 2

FileAppend,% FileContent%,% LogFile%

Nối mọi thứ trong biến “FileContent” vào tập tin “LogFile”.

Sử dụng chức năng Nối của AHK để cập nhật tệp nhật ký hoặc tạo một tệp từ đầuSử dụng chức năng Nối của AHK để cập nhật tệp nhật ký hoặc tạo một tệp từ đầu

Các “nối thêm” chức năng sẽ thêm “FileContent” vào tệp nếu nó tồn tại, nhưng cũng sẽ tạo nó từ đầu nếu tệp không tồn tại.

Có một tinh chỉnh cuối cùng: thay thế nội dung của biến LastActiveWindow bằng cửa sổ hiện đang hoạt động.

Chèn tiêu đề của cửa sổ đang hoạt động hiện tại vào biến LastActiveWindow để kiểm tra trong tương laiChèn tiêu đề của cửa sổ đang hoạt động hiện tại vào biến LastActiveWindow để kiểm tra trong tương lai

Để làm điều này, tập lệnh sẽ có thể phát hiện thay đổi cửa sổ tiếp theo.

LastActiveWindow =% ActiveWindow%

Và với lần bổ sung cuối cùng đó, trình ghi nhật ký cửa sổ đã sẵn sàng! Lưu tập lệnh và chạy nó. Sau đó kiểm tra tệp đánh dấu, nó sẽ xuất hiện trong thư mục tệp script sau 10 giây.

Tệp nhật ký windows được tạo trong cùng thư mục với tập lệnhTệp nhật ký windows được tạo trong cùng thư mục với tập lệnh

Sở hữu thời gian của riêng bạn

Bạn có thể mở tệp nhật ký bằng bất kỳ trình soạn thảo văn bản nào. Tuy nhiên, nó sẽ đẹp hơn nếu bạn mở trong một trình chỉnh sửa tương thích với markdown. Trong ảnh chụp màn hình, bạn có thể thấy nhật ký trong trình chỉnh sửa Typora phổ biến.

Tệp đánh dấu được tạo bởi tập lệnh được tải trong TyporaTệp đánh dấu được tạo bởi tập lệnh được tải trong Typora

Đây là một cách dễ dàng để kiểm tra xem bạn đã sử dụng ứng dụng nào nhiều nhất và nó chỉ cần một công cụ như Notepad để sử dụng.

Nếu bạn muốn một cái gì đó “đặc biệt hơn”, bạn luôn luôn có thể mà “cách điệu” đầu ra của trình ghi nhật ký để tạo tệp CSV thay thế. Nó dễ dàng như điều chỉnh biến FileContent và phần mở rộng của tệp đã tạo. Sau đó, bạn có thể nhập các tệp như vậy vào các ứng dụng như Excel, Google Calc hoặc thậm chí là trình theo dõi thời gian của bên thứ ba.

Tập lệnh hoàn chỉnh

#NoEnv; Được đề xuất cho hiệu suất và khả năng tương thích với các bản phát hành AutoHotkey trong tương lai. ; #Cảnh báo ; Bật cảnh báo để hỗ trợ phát hiện các lỗi phổ biến. Đầu vào SendMode; Được đề xuất cho các tập lệnh mới do tốc độ và độ tin cậy vượt trội của nó. SetWorkingDir% A_ScriptDir%; Đảm bảo một thư mục bắt đầu nhất quán. ; Biến ; ——— AppLoggingRate = 10; Khoảng thời gian (tính bằng giây) giữa các lần chụp tiêu đề cửa sổ đang hoạt động. SleepTime: = AppLoggingRate * 1000 LogPath =% A_ScriptDir% LastActiveWindow =; Hợp lý ; —– Vòng lặp {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%}} Thoát