<!DOCTYPE html>
    <html lang="vi" xmlns="http://www.w3.org/1999/xhtml" prefix="og: http://ogp.me/ns#">
    <head>
<title>Cách tạo ứng dụng theo dõi thời gian trên Windows với AutoHotKey</title>
<meta name="description" content="Cách tạo ứng dụng theo dõi thời gian trên Windows với AutoHotKey - Savefile - Tin Tức -...">
<meta name="author" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :.">
<meta name="copyright" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :. [admin@nguoicodonvn2008.info]">
<meta name="robots" content="index, archive, follow, noodp">
<meta name="googlebot" content="index,archive,follow,noodp">
<meta name="msnbot" content="all,index,follow">
<meta name="generator" content="NukeViet v4.5">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta property="og:title" content="Cách tạo ứng dụng theo dõi thời gian trên Windows với AutoHotKey">
<meta property="og:type" content="website">
<meta property="og:description" content="Savefile - Tin Tức - https&#x3A;&#x002F;&#x002F;www.nguoicodonvn2008.info&#x002F;vi&#x002F;news&#x002F;savefile&#x002F;kien-thuc-may-tinh&#x002F;cach-tao-ung-dung-theo-doi-thoi-gian-tren-windows-voi-autohotkey-4823.html">
<meta property="og:site_name" content=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.">
<meta property="og:url" content="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-tao-ung-dung-theo-doi-thoi-gian-tren-windows-voi-autohotkey-4823.html">
<link rel="shortcut icon" href="https://www.nguoicodonvn2008.info/favicon.ico">
<link rel="canonical" href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-tao-ung-dung-theo-doi-thoi-gian-tren-windows-voi-autohotkey-4823.html">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/" title="Tin Tức" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/karaoke-dual/" title="Tin Tức - Karaoke Dual" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/nhac-tre/" title="Tin Tức - Nhạc trẻ" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tru-tinh/" title="Tin Tức - Trữ tình" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/nuoc-ngoai/" title="Tin Tức - Nước ngoài" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/remix/" title="Tin Tức - Remix" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tam-su-tinh-yeu/" title="Tin Tức - Tâm sự tình yêu" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tho-suu-tam/" title="Tin Tức - Thơ sưu tầm" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/cuoc-song/" title="Tin Tức - Cuộc sống" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/phan-mem/" title="Tin Tức - Phần mềm" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/kien-thuc-may-tinh/" title="Tin Tức - Kiến thức máy tính" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/hoc-tap/" title="Tin Tức - Học tập" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/tai-lieu/" title="Tin Tức - Tài liệu" type="application/rss+xml">
<link rel="alternate" href="https://www.nguoicodonvn2008.info/vi/news/rss/de-thi/" title="Tin Tức - Đề thi" type="application/rss+xml">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/assets/css/font-awesome.min.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/style.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/style.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/news.css" type="text/css">
<link rel="preload" as="style" href="https://www.nguoicodonvn2008.info/themes/default/css/custom.css" type="text/css">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/jquery/jquery.min.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/language/vi.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/global.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/assets/js/site.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/news.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/main.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/custom.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.nguoicodonvn2008.info/themes/default/js/bootstrap.min.js" type="text/javascript">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/assets/css/font-awesome.min.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/style.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/style.non-responsive.css">
<link rel="StyleSheet" href="https://www.nguoicodonvn2008.info/themes/default/css/news.css">
<link rel="stylesheet" href="https://www.nguoicodonvn2008.info/themes/default/css/custom.css">
<style type="text/css">
	body{background: #fff;}
</style>
    </head>
    <body>
<div id="print">
	<div id="hd_print">
		<h2 class="pull-left">.&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.</h2>
		<p class="pull-right"><a title=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;." href="https://www.nguoicodonvn2008.info/">https://www.nguoicodonvn2008.info</a></p>
	</div>
	<div class="clear"></div>
	<hr />
	<div id="content">
		<h1>Cách tạo ứng dụng theo dõi thời gian trên Windows với AutoHotKey</h1>
		<ul class="list-inline">
			<li>Thứ ba - 30/11/2021 21:29</li>
			<li class="hidden-print txtrequired"><em class="fa fa-print">&nbsp;</em><a title="In ra" href="javascript:;" onclick="window.print()">In ra</a></li>
			<li class="hidden-print txtrequired"><em class="fa fa-power-off">&nbsp;</em><a title="Đóng cửa sổ này" href="javascript:;" onclick="window.close()">Đóng cửa sổ này</a></li>
		</ul>
		<div class="clear"></div>
		<div id="hometext">
		</div>
				<div class="imghome">
			<img alt="Cách tạo ứng dụng theo dõi thời gian trên Windows với AutoHotKey" src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-1.jpg" width="460" class="img-thumbnail" />
		</div>
		<div class="clear"></div>
		<div id="bodytext" class="clearfix">
			<p style="text-align: justify;">Bạn bắt đầu công việc mỗi ngày từ sớm để có thể giải quyết hết mọi thứ trong ngày. Sau đó, bạn kiểm tra đồng hồ đã 3 giờ sáng mà công việc vẫn chưa làm hết. Vậy thời gian đã trôi đi đâu?</p>

<p style="text-align: justify;">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 nhỉ? Ứ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ờ. Hãy bắt đầu nào!</p>

<h2 style="text-align: justify;">Tạo script ghi nhật ký cửa sổ của riêng bạn với AutoHotKey</h2>

<p style="text-align: justify;">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ư &quot;trình phân tích cú pháp&quot; cho script. Đó là công cụ sẽ cho phép script của bạn &quot;chạy&quot;.</p>

<div style="text-align: justify;">&nbsp;</div>

<p style="text-align: justify;"><strong>Lưu ý</strong>: Bạn cũng có thể biên dịch script sau khi hoàn tất để biến nó thành một chương trình thực thi thực sự. Tuy nhiên, điều đó nằm ngoài phạm vi của bài viết này.</p>

<p style="text-align: justify;">Tải AutoHotKey từ trang web chính thức:&nbsp;<span style="color:rgb(192, 57, 43);"><strong>www.autohotkey.com/&nbsp;</strong></span>và cài đặt nó.</p>

<figure>
<div style="text-align: justify;"><br />
<img alt="Chọn New &gt; AutoHotKey Script" data-i="0" data-inimage-loaded="true" data-src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-1.jpg" data-was-processed="true" height="388" src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-1.jpg" width="650" /></div>

<figcaption>
<div style="text-align: justify;">Chọn New &gt; AutoHotKey Script</div>
</figcaption>
</figure>

<p style="text-align: justify;">Kích hoạt trình quản lý file yêu thích và truy cập thư mục mà bạn muốn lưu trữ script. Sau đó, nhấp chuột phải vào một vị trí trống và chọn&nbsp;<strong>New &gt; AutoHotKey Script</strong>.</p>

<div style="text-align: justify;">&nbsp;</div>

<p style="text-align: justify;">Sau khi hoàn thành, đã đến lúc viết script thực tế.</p>

<h3 style="text-align: justify;">1. Xác định các biến cần thiết</h3>

<p style="text-align: justify;">Mở script trong trình chỉnh sửa yêu thích. Bạn có thể sử dụng một cái gì đó đơn giản như Notepad đi kèm với Windows, còn bài viết sẽ sử dụng&nbsp;Notepad++&nbsp;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 style="text-align: justify;">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 Documents, điều này có thể ảnh hưởng đến định dạng của script. Hãy sử dụng trình soạn thảo văn bản hoặc code.</p>

<p style="text-align: justify;">Script sẽ chứa một số thông tin cơ bản được khuyến nghị về khả năng tương thích và hiệu suất. Giữ nguyên chúng và bắt đầu script bên dưới.</p>

<p style="text-align: justify;">Bắt đầu với:</p>

<pre id="pre0">
<code>AppLoggingRate = 10 ; Time interval (in seconds) between active window title captures.
SleepTime := AppLoggingRate * 1000
LogPath = %A_ScriptDir%
LastActiveWindow =</code></pre>

<p style="text-align: justify;">Bắt đầu bằng cách gán giá trị&nbsp;<strong>&quot;10&quot;</strong>&nbsp;cho&nbsp;<strong>AppLoggingRate</strong>, giá trị này sẽ được sử dụng để tính toán thời gian giữa các lần ghi nhật ký cửa sổ.</p>

<p style="text-align: justify;">Khi được sử dụng với chức năng Sleep của AHK, 1000 gần bằng một giây. Vì vậy, bằng cách nhân nó với&nbsp;<strong>AppLogingRate</strong>, bạn sẽ làm cho biến SleepTime &quot;bằng 10 giây&quot;.</p>

<p style="text-align: justify;"><strong>LogPath</strong>&nbsp;là đường dẫn dùng để lưu trữ các bản ghi. Ví dụ đang sử dụng giá trị&nbsp;<strong>%A_ScriptDir%</strong>, giá trị này được dịch thành &quot;thư mục từ nơi bạn chạy script&quot;. Bạn có thể sử dụng đường dẫn đầy đủ đến thư mục khác nếu muốn.</p>

<div style="text-align: justify;">&nbsp;</div>

<p style="text-align: justify;">Cuối cùng, đặt&nbsp;<strong>LastActiveWindow</strong>&nbsp;thành trống và sử dụng sau để kiểm tra xem cửa sổ đang hoạt động có thay đổi hay không.</p>

<h3 style="text-align: justify;">2. Giám sát các cửa sổ đang hoạt động</h3>

<p style="text-align: justify;">Vì ta muốn liên tục theo dõi cửa sổ nào đang hoạt động và nếu nó thay đổi, thì ghi lại tiêu đề và thời gian, nên sẽ phải sử dụng một “loop&quot; (vòng lặp).</p>

<p style="text-align: justify;">Như tên gọi cho thấy, một vòng lặp chạy liên tục, lặp lại (các) chức năng giống nhau. Nhờ cú pháp đơn giản của AHK, &quot;code&quot; sau đây tương đối dễ hiểu:</p>

<pre id="pre1">
<code>Loop
{
    Sleep %SleepTime%
    Msgbox, It Works!
}</code></pre>

<p style="text-align: justify;">Xác định một vòng lặp bằng cách chỉ cần gõ từ &quot;loop&quot; và sau đó đánh dấu phần đầu của nó bằng&nbsp;<strong>&quot;{&quot;</strong>&nbsp;và kết thúc bằng&nbsp;<strong>&quot;}&quot;.</strong>&nbsp;Mọi thứ ở các dòng giữa&nbsp;<strong>&quot;{&quot;</strong>&nbsp;và&nbsp;<strong>&quot;}&quot;</strong>&nbsp;sẽ chạy vĩnh viễn cho đến khi bạn thoát khỏi script.</p>

<p style="text-align: justify;">Bắt đầu vòng lặp bằng cách đợi (<strong>Sleep</strong>) trong một khoảng thời gian bằng với biến&nbsp;<strong>SleepTime.</strong>&nbsp;Biến này làm cho việc kiểm soát thời gian trở nên đơn giản hơn. Thay vì tự chỉnh sửa script, bạn có thể &quot;cho&quot; nó biết, thông qua biến này, mỗi vòng lặp sẽ kéo dài bao nhiêu giây.</p>

<p style="text-align: justify;">Cuối cùng, sử dụng&nbsp;<strong>Message Box</strong>&nbsp;để kiểm tra script. Hãy thử lưu và chạy nó (nhấp đúp vào file script). Bạn sẽ thấy một hộp thông báo cho biết&nbsp;<strong>&quot;It Works!”</strong>&nbsp;(script đang hoạt động) sau 10 giây.</p>

<p style="text-align: justify;">Nhấp chuột phải vào biểu tượng của AHK trong khay Windows và thoát khỏi script khi bạn đã có đủ hộp thông báo. Sau đó, quay lại trình soạn thảo và thay thế dòng&nbsp;<strong>MsgBox</strong>&nbsp;bằng:</p>

<pre id="pre2">
<code>WinGetActiveTitle, ActiveWindow</code></pre>

<p style="text-align: justify;">Đây là lệnh để lấy tiêu đề của cửa sổ đang hoạt động. Bỏ qua dòng&nbsp;<strong>&quot;StoreActiveWindow&quot;</strong>&nbsp;bổ sung mà ví dụ đã sử dụng trong khi viết script để thử nghiệm.</p>

<figure>
<div style="text-align: justify;"><img alt="Lấy tiêu đề của cửa sổ đang hoạt động và lưu trữ nó trong một biến" data-i="1" data-src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-2.jpg" data-was-processed="true" height="419" src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-2.jpg" width="650" /></div>

<figcaption>
<div style="text-align: justify;">Lấy tiêu đề của cửa sổ đang hoạt động và lưu trữ nó trong một biến</div>
</figcaption>
</figure>

<h3 style="text-align: justify;">3. Lấy thời gian và tên hiện tại</h3>

<p style="text-align: justify;">Bây giờ đến phần 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, hãy &quot;làm gì đó&quot;. Mọi thứ đơn giản như sau:</p>

<pre id="pre3">
<code>If ActiveWindow != %LastActiveWindow%
{
}</code></pre>

<p style="text-align: justify;">Với những điều trên, kiểm tra xem&nbsp;<strong>ActiveWindow</strong>&nbsp;hiện tại có khác (<strong>!=</strong>) với giá trị được lưu trữ trong biến&nbsp;<strong>LastActiveWindow</strong>&nbsp;(mà ban đầu được đặt thành trống) hay không. Nếu đúng như vậy, AHK sẽ thực thi code giữa&nbsp;<strong>{</strong>&nbsp;và&nbsp;<strong>}</strong>, hiện đang trống.</p>

<figure>
<div style="text-align: justify;"><img alt="Thiết lập chức năng so sánh tiêu đề của cửa sổ đang hoạt động và cửa sổ trước đó" data-i="2" data-src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-3.jpg" data-was-processed="true" height="419" src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-3.jpg" width="650" /></div>

<figcaption>
<div style="text-align: justify;">Thiết lập chức năng so sánh tiêu đề của cửa sổ đang hoạt động và cửa sổ trước đó</div>
</figcaption>
</figure>

<p style="text-align: justify;">Cần theo dõi cả ngày và giờ để đo thời gian hoạt động của một cửa sổ. Các nhật ký khác nhau cho mỗi ngày, sử dụng ngày trong tên của chúng sẽ được giữ lại. Không chỉ mọi thay đổi mà thời điểm nó xảy ra cũng sẽ được ghi lại. Để làm điều đó, hãy gán những định dạng thời gian khác nhau cho các biến&nbsp;<strong>LogTime</strong>&nbsp;và&nbsp;<strong>LogFilename</strong>, với:</p>
&nbsp;

<pre id="pre4">
<code>FormatTime, LogTime,, HH:mm:ss
FormatTime, LogFilename,, yyyy-MMM-dd</code></pre>

<p style="text-align: justify;">Thêm các dòng đó vào giữa các dấu ngoặc nhọn trong&nbsp;<strong>&quot;If ActiveWindow...&quot;</strong>, để AHK chạy chúng khi phát hiện thay đổi cửa sổ.</p>

<figure>
<div style="text-align: justify;"><img alt="Lấy thời gian hiện tại và gán nó trong hai biến có định dạng khác nhau" data-i="3" data-src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-4.jpg" data-was-processed="true" height="419" src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-4.jpg" width="650" /></div>

<figcaption>
<div style="text-align: justify;">Lấy thời gian hiện tại và gán nó trong hai biến có định dạng khác nhau</div>
</figcaption>
</figure>

<h3 style="text-align: justify;">4. Định dạng dữ liệu</h3>

<p style="text-align: justify;">Hiện ta đã 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. Có thể xóa tất cả các ký tự không phải chữ và số bằng cách sử dụng hỗ trợ của AHK cho RegEx, với:</p>

<pre id="pre5">
<code>LogWindow := Regexreplace(ActiveWindow, &quot;&#91;^a-zA-Z0-9&#93;&quot;, &quot; &quot;)</code></pre>

<p style="text-align: justify;">Với điều này, hãy &quot;yêu cầu&quot; 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:</p>

<ul>
	<li style="text-align: justify;">Chữ viết thường</li>
	<li style="text-align: justify;">Chữ viết hoa</li>
	<li style="text-align: justify;">Con số</li>
</ul>

<p style="text-align: justify;">Sau đó, gán kết quả cho biến&nbsp;<strong>LogWindow.</strong></p>

<figure>
<div style="text-align: justify;"><img alt="Dọn dẹp tiêu đề của cửa sổ đang hoạt động với RegEx" data-i="4" data-src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-5.jpg" data-was-processed="true" height="419" src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-5.jpg" width="650" /></div>

<figcaption>
<div style="text-align: justify;">Dọn dẹp tiêu đề của cửa sổ đang hoạt động với RegEx</div>
</figcaption>
</figure>

<p style="text-align: justify;">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, hiện bạn đã sẵn sàng định dạng file nhật ký và nội dung của nó.</p>

<pre id="pre6">
<code>LogFilename = %LogFilename%_AppLog.md
LogFile = %LogPath%\%LogFilename%</code></pre>

<p style="text-align: justify;">Trước đây, ta đã gán ngày hiện tại cho biến&nbsp;<strong>LogFilename.</strong>&nbsp;Do đó, với dòng đầu tiên, hãy thêm&nbsp;<strong>&quot;_AppLog.md&quot;</strong>&nbsp;vào ngày để sử dụng nó làm tên file.</p>

<figure>
<div style="text-align: justify;"><img alt="Thiết lập tên file nhật ký" data-i="5" data-src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-6.jpg" data-was-processed="true" height="419" src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-6.jpg" width="650" /></div>

<figcaption>
<div style="text-align: justify;">Thiết lập tên file nhật ký</div>
</figcaption>
</figure>

<div style="text-align: justify;">&nbsp;</div>

<p style="text-align: justify;">Trong dòng thứ hai, kết hợp biến&nbsp;<strong>LogPath</strong>, đã xác định ở đầu làm đích cho file nhật ký đi kèm với tên file. Sự kết hợp của chúng là tên đường dẫn đầy đủ của file nhật ký, được gán cho biến&nbsp;<strong>LogFile.</strong></p>

<p style="text-align: justify;">Hãy gán giá trị tương đương của&nbsp;<em>&quot;empty line, Time - Window&#039;s Name, two more empty lines, a divider, and another empty line, for good measure&quot;&nbsp;</em>cho biến&nbsp;<strong>FileContent.</strong></p>

<pre id="pre7">
<code>FileContent = `n%LogTime% - %LogWindow%`n`n- - -`n</code></pre>

<ul>
	<li style="text-align: justify;">Chữ&nbsp;<strong>&quot;n&quot;</strong>&nbsp;yêu cầu AHK nhập một dòng mới (tương đương với việc nhấn&nbsp;<strong>Enter</strong>&nbsp;một lần).</li>
	<li style="text-align: justify;">Ba dấu gạch ngang sẽ xuất hiện như một dải phân cách khi được hiển thị trong trình xem tương thích với dấu xuống.</li>
	<li style="text-align: justify;">&quot;%&nbsp;<strong>LogTime%&quot;</strong>&nbsp;và &quot;%&nbsp;<strong>LogWindow%&quot;</strong>&nbsp;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.</li>
</ul>

<figure>
<div style="text-align: justify;"><img alt="Xác định nội dung của file nhật ký" data-i="6" data-src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-7.jpg" data-was-processed="true" height="419" src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-7.jpg" width="650" /></div>

<figcaption>
<div style="text-align: justify;">Xác định nội dung của file nhật ký</div>
</figcaption>
</figure>

<h3 style="text-align: justify;">5. Cập nhật file</h3>

<p style="text-align: justify;">Bạn đã xác định những gì chúng tôi muốn ghi vào file, cũng như đường dẫn và tên file 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:</p>

<pre id="pre8">
<code>FileAppend, %FileContent%, %LogFile%</code></pre>

<p style="text-align: justify;">Nối mọi thứ trong biến&nbsp;<strong>&quot;FileContent&quot;</strong>&nbsp;vào file&nbsp;<strong>&quot;LogFile&quot;.</strong></p>

<figure>
<div style="text-align: justify;"><img alt="Sử dụng chức năng Append (nối) của AHK để cập nhật file nhật ký hoặc tạo một file từ đầu" data-i="7" data-src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-8.jpg" data-was-processed="true" height="419" src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-8.jpg" width="650" /></div>

<figcaption>
<div style="text-align: justify;">Sử dụng chức năng Append (nối) của AHK để cập nhật file nhật ký hoặc tạo một file từ đầu</div>
</figcaption>
</figure>

<p style="text-align: justify;">Hàm &quot;append&quot; sẽ thêm &quot;FileContent&quot; vào file nếu nó tồn tại, nhưng cũng sẽ tạo từ đầu nếu file không tồn tại.</p>

<p style="text-align: justify;">Có một tinh chỉnh cuối cùng: thay thế nội dung của biến&nbsp;<strong>LastActiveWindow</strong>&nbsp;bằng cửa sổ hiện đang hoạt động.</p>

<figure>
<div style="text-align: justify;"><img alt="Chèn tiêu đề của cửa sổ hoạt động hiện tại vào biến LastActiveWindow để kiểm tra trong tương lai" data-i="8" data-src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-9.jpg" data-was-processed="true" height="419" src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-9.jpg" width="650" /></div>

<figcaption>
<div style="text-align: justify;">Chèn tiêu đề của cửa sổ hoạt động hiện tại vào biến LastActiveWindow để kiểm tra trong tương lai</div>
</figcaption>
</figure>

<div style="text-align: justify;"><img alt="" id="vdo_ai_cross" src="https://a.vdo.ai/core/assets/img/cross.svg" /></div>

<p style="text-align: justify;">Để làm điều này, script sẽ có thể phát hiện thay đổi cửa sổ tiếp theo.</p>

<pre id="pre9">
<code>LastActiveWindow = %ActiveWindow%</code></pre>

<p style="text-align: justify;">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 lại script và chạy nó. Sau đó, kiểm tra file markdown, file này sẽ xuất hiện trong thư mục file script sau 10 giây.</p>

<figure>
<div style="text-align: justify;"><img alt="File nhật ký cửa sổ được tạo trong cùng thư mục với script" data-i="9" data-src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-10.jpg" data-was-processed="true" height="372" src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-10.jpg" width="650" /></div>

<figcaption>
<div style="text-align: justify;">File nhật ký cửa sổ được tạo trong cùng thư mục với script</div>
</figcaption>
</figure>

<h2 style="text-align: justify;">Tự mình làm chủ thời gian</h2>

<p style="text-align: justify;">Bạn có thể mở file 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ẽ trông đẹ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.</p>

<figure>
<div style="text-align: justify;"><img alt="File markdown tạo ra bởi script được load trong Typora" data-i="10" data-src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-11.jpg" data-was-processed="true" height="379" src="https://st.quantrimang.com/photos/image/2021/11/23/tao-ung-dung-theo-doi-thoi-gian-windows-voi-autohotkey-11.jpg" width="650" /></div>

<figcaption>
<div style="text-align: justify;">File markdown tạo ra bởi script được load trong Typora</div>
</figcaption>
</figure>

<p style="text-align: justify;">Đó là một cách dễ dàng để kiểm tra ứng dụng nào bạn đã sử dụng nhiều thời gian nhất và chỉ cần một công cụ đó như Notepad để sử dụng.</p>

<p style="text-align: justify;">Nếu bạn muốn thứ gì đó &quot;đặc biệt hơn&quot;, bạn luôn có thể &quot;tạo phong cách&quot; cho đầu ra của trình ghi nhật ký để tạo file CSV thay thế. Dễ dàng như điều chỉnh biến&nbsp;<strong>FileContent</strong>&nbsp;và phần mở rộng của file đã tạo. Sau đó, bạn có thể nhập các file 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.</p>

<h2 style="text-align: justify;">Script hoàn chỉnh</h2>

<pre id="pre10">
<code>#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, &quot;&#91;^a-zA-Z0-9&#93;&quot;, &quot; &quot;)
		LogFilename = %LogFilename%_AppLog.md
		LogFile = %LogPath%\%LogFilename%
		FileContent = `n%LogTime% - %LogWindow%`n`n- - -`n
		sleep 50
		FileAppend, %FileContent%, %LogFile%
		LastActiveWindow = %ActiveWindow%
	}
}
Exit</code></pre>
		</div>
				<div id="author">
						<p>
				<strong>Nguồn tin:</strong>
				Quantrimang.com
			</p>
		</div>
	</div>
	<div id="footer" class="clearfix">
		<div id="url">
			<strong>URL của bản tin này: </strong><a href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-tao-ung-dung-theo-doi-thoi-gian-tren-windows-voi-autohotkey-4823.html" title="Cách tạo ứng dụng theo dõi thời gian trên Windows với AutoHotKey">https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-tao-ung-dung-theo-doi-thoi-gian-tren-windows-voi-autohotkey-4823.html</a>

		</div>
		<div class="clear"></div>
		<div class="copyright">
			&copy; .&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.
		</div>
		<div id="contact">
			<a href="mailto:admin@nguoicodonvn2008.info">admin@nguoicodonvn2008.info</a>
		</div>
	</div>
</div>
        <div id="timeoutsess" class="chromeframe">
            Bạn đã không sử dụng Site, <a onclick="timeoutsesscancel();" href="https://www.nguoicodonvn2008.info/#">Bấm vào đây để duy trì trạng thái đăng nhập</a>. Thời gian chờ: <span id="secField"> 60 </span> giây
        </div>
        <div id="openidResult" class="nv-alert" style="display:none"></div>
        <div id="openidBt" data-result="" data-redirect=""></div>
		</script>
		<div class="car-top">
  <span><img src="https://www.nguoicodonvn2008.info/themes/default/images/car.png" alt=""></span>
</div>
<script src="https://www.nguoicodonvn2008.info/assets/js/jquery/jquery.min.js"></script>
<script>var nv_base_siteurl="/",nv_lang_data="vi",nv_lang_interface="vi",nv_name_variable="nv",nv_fc_variable="op",nv_lang_variable="language",nv_module_name="news",nv_func_name="savefile",nv_is_user=0, nv_my_ofs=-4,nv_my_abbr="EDT",nv_cookie_prefix="nv4c_e856T",nv_check_pass_mstime=1738000,nv_area_admin=0,nv_safemode=0,theme_responsive=0,nv_recaptcha_ver=2,nv_recaptcha_sitekey="",nv_recaptcha_type="image",XSSsanitize=1;</script>
<script src="https://www.nguoicodonvn2008.info/assets/js/language/vi.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/global.js"></script>
<script src="https://www.nguoicodonvn2008.info/assets/js/site.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/news.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/main.js"></script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/custom.js"></script>
<script type="application/ld+json">
        {
            "@context": "https://schema.org",
            "@type": "Organization",
            "url": "https://www.nguoicodonvn2008.info",
            "logo": "https://www.nguoicodonvn2008.info/uploads/angel.gif"
        }
        </script>
<script src="https://www.nguoicodonvn2008.info/themes/default/js/bootstrap.min.js"></script>
<script type="text/javascript">
var $scrolltop = $('.car-top');
$scrolltop.on('click', function () {
    $('html,body').animate({
        scrollTop: 0
    }, 800);
    $(this).addClass("car-run");
    setTimeout(function(){ $scrolltop.removeClass('car-run');}, 1000);
    return false;
});
$(window).on('scroll', function ()
{ 
    if($(window).scrollTop() >= 200)
    {
        $scrolltop.addClass("show");
        $scrolltop.addClass("car-down");
    }
    else
    {
       $scrolltop.removeClass("show");
       setTimeout(function(){ $scrolltop.removeClass('car-down');}, 300);
    }
});
</script>
</body>
</html>