[AUTOIT] Tự Động Ghi Vị Trí Chuột Trên Màn Hình Với AutoIT

Chào mọi người, đã lâu rồi mình không mò mẫm về ngôn ngữ lập trình AutoIT mà lúc xưa mình hay tìm hiểu và viết lách những chương trình đơn giản mà thú vị cho bản thân để tiện trong công việc, nhưng rồi nhiều chương trình mới ra mình cứ chạy theo nên quên đi kiến thức lúc xưa mà mình hay tìm hiểu và viết chương trình tích hợp với Windows để giúp mọi người làm việc nhiều hơn, mình còn nhớ lúc đó mình có viết chương trình hack game audition, một game mà tuổi trẻ 8x,9x không thể nào quên được.

📕 KIẾN THỨC CẦN BIẾT

Bạn cần biết cơ bản về AutoIT để đọc hiểu bài viết này. Bạn có thể xem tutorial AutoIT tại đây, hoặc học vỡ lòng AutoIT qua video tại đây.

💡 MÔ TẢ CHƯƠNG TRÌNH

Chương trình sẽ đọc vị trí chuột mỗi 1 giây trôi qua, và lưu nó vào file với cấu trúc INI. Tương tự với việc giả lập lại vị trí chuột.
Chúng ta có thể hình dung hoạt động của chương trình qua sơ đồ sau:


🚀 CHÚNG TA BẮT ĐẦU.

Bước 1: Tạo giao diện chọn tính năng. Chúng ta sử dụng Inputbox để làm giao diện chính.
$input = InputBox("Mouse Recorder","Mời nhập tính năng")
; với tính năng 1: bắt đầu record vị trí mouse
; tính năng 2: giả lập lại vị trí
; còn lại: thoát
Bước 2: Viết tính năng theo dõi vị trí chuột.
Đầu tiên, ta cần hỏi người dùng sẽ theo dõi trong bao nhiêu giây.
$sec = InputBox("Mouse Recorder","Vui lòng nhập số giây cần theo dõi")
$sec = Number($sec) ; chuyển giá trị mà biến $sec nhận được thành kiểu số
Sau khi biết được số giây cần theo dõi, ta dùng hàm For để chạy từ 1 (giây) đến n (giây) đó.
For $i = 1 to $sec ; chạy từ 1 đến $sec (giây)
   ; Code của bạn tại đây
Next
Sau đó, chúng ta tiến hành lấy vị trí bằng hàm MouseGetPos, MouseGetPos trả về cho chúng ta 1 mảng, ngăn thứ nhất của mảng là tọa độ x và ngăn thứ hai là tọa độ y của con trỏ chuột.
For $i = 1 to $sec ; chạy từ 1 đến $sec (giây)
   $vi_tri = MouseGetPos() ; lấy vị trí chuột
   $x = $vi_tri[0] ; vị trí x của chuột chính là ngăn đầu tiên
   $y = $vi_tri[1]
Next
Có được vị trí, chúng ta lưu tọa độ "x,y" vào file với cấu trúc INI như sau: sectionMOUSE, key$i (với $i chính là biến chạy của For).
For $i = 1 to $sec ; chạy từ 1 đến $sec (giây)
   $vi_tri = MouseGetPos() ; lấy vị trí chuột
   $x = $vi_tri[0] ; vị trí x của chuột chính là ngăn đầu tiên
   $y = $vi_tri[1]
   IniWrite("MouseRecord.ini","MOUSE",$i,$x&","&$y) ; lưu vào file với cấu trúc INI
Next
Cuối cùng ở bước này, ta thêm 1 hàm Sleep để ngưng thực hiện code trong vòng 1 giây. Vì giả thuyết chương trình của chúng ta ghi lại tọa độ chuột sau mỗi 1 giây.
For $i = 1 to $sec ; chạy từ 1 đến $sec (giây)
   $vi_tri = MouseGetPos() ; lấy vị trí chuột
   $x = $vi_tri[0] ; vị trí x của chuột chính là ngăn đầu tiên
   $y = $vi_tri[1]
   IniWrite("MouseRecord.ini","MOUSE",$i,$x&","&$y) ; lưu vào file với cấu trúc INI
   Sleep(1000) ; ngủ 1000 mili giây = 1 giây
Next
Bước 3: Thực hiện giả lập lại vị trí chuột.
Đầu tiên, chúng ta cần biết sẽ phải thực hiện bao nhiêu giây, mà mỗi một giây thì tọa độ chuột được lưu với 1 key tại section MOUSE của file INI. Điều đó đồng nghĩa file INI đó có n giây chính là n số key được lưu lại section MOUSE.
$read = IniReadSection("MouseRecord.ini","MOUSE")
$n = $read[0][0] ; tổng số key đọc được = tổng số n giây sẽ thực hiện
Chúng ta thực hiện tương tự như bước ghi tọa độ. Với vòng lặp For chạy từ 1 tới n (giây), mỗi lần chạy vòng lặp chúng ta sẽ thực hiện giả lập di chuyển chuột và ngưng code lại 1 giây.
For $i = 1 to $n
   $pos = $read[$i][1] ; giá trị tọa độ có dạng "x,y" của key thứ $i
   $tach = StringSplit($pos,',') ; tách dấu phẩy ra để lấy x, y
   $x = Number($tach[1]) ; "x,y" thì sau khi tách, x nằm ở $tach[1], y nằm ở $tach[2], $tach[0] là tổng số chuỗi tách đc, dùng Number() để ép kiểu chuỗi thành số để đảm bảo MouseMove hoạt động ổn định
   $y = Number($tach[2])
   MouseMove($x,$y)
   Sleep(1000)
Next
Vậy là xong, bước cuối cùng chúng ta chỉ cần ghép nối các phần đó lại với nhau thành một chương trình hoàn chỉnh ^^.
If Number($input) = 1 Then ; biến $input chính là giá trị trả về của InputBox ở bước 1
   ; Code thực hiện ở Bước 2
Else Number($input) = 2 Then
   ; Code thực hiện ở bước 3
Else
   Exit
EndIf
Tuy nhiên, trong một số bản Window, chương trình của bạn có thể sẽ không di chuyển được chuột vì thiếu quyền Admin. Vì vậy chúng ta có thể thiết lập mặc định yêu cầu quyền admin để chạy bằng cách đặt dòng lệnh sau ở đầu code.
#RequireAdmin
Mời các bạn tham khảo code hoàn chỉnh tại đây:
#cs
 Chương trình ghi lại vị trí chuột đơn giản sau mỗi 1 giây và giả lập lại nó.
 Dựa vào ý tưởng của đề bài 5 - buổi 3 khóa học Vỡ Lòng AutoIT

 CODE MẪU - Coded by opdo.vn
 Hướng dẫn thực hiện tại http://www.opdo.vn/2016/03/viet-chuong-trinh-theo-doi-vi-tri-chuot.html
#ce
#RequireAdmin ; chạy với quyền admin
While 1
 $input = InputBox("AutoIT Mouse Recorder","Mời bạn chọn tính năng"&@CRLF&"- Chọn 1 để theo dõi vị trí chuột"&@CRLF&'- Chọn 2 để giả lập lại vị trí chuột'&@CRLF&'- Còn lại: thoát chương trình'&@CRLF&'Code mẫu - Coded by opdo.vn')
 If @error Then Exit
 If Number($input) = 1 Then
  $sec = InputBox("AutoIT Mouse Recorder","Vui lòng nhập số giây cần theo dõi")
  If Number($sec) <= 0 Then ContinueLoop ; nếu nhập $sec <= 0 thì bỏ qua các bước dưới, chạy tiếp vòng lặp
  IniDelete("Save.ini","MOUSE")
  $text = SplashTextOn("","",200,50,0,0,1,"Tahoma",15) ; tạo một Splash Text, xem trong file help
  WinSetTrans($text,"",160) ; tạo độ mờ cho splash text trên
  For $i = 1 to Number($sec) ; chạy vòng lặp từ 1 đến $sec
   ControlSetText($text, "", "Static1", "Đã ghi "&$i&' giây') ; set text cho Splash Text, xem trong file help
   $mouse_pos = MouseGetPos() ; lấy vị trí chuột
   IniWrite("Save.ini","MOUSE",$i,$mouse_pos[0]&','&$mouse_pos[1]) ; ghi lại vị trí đó với dạng "x,y" tại key $i của section MOUSE
   Sleep(1000) ; ngủ 1 giây
  Next
  SplashOff() ; tắt splash text, xem trong file help
  MsgBox(64,"Thông báo","Đã ghi vị trí chuột thành công. Chọn 2 để giả lập lại vị trí")
 ElseIf Number($input) = 2 Then
  $read = IniReadSection("Save.ini","MOUSE") ; đọc section MOUSE trong file Save.ini
  $text = SplashTextOn("","",200,50,0,0,1,"Tahoma",15) ; tạo một Splash Text, xem trong file help
  WinSetTrans($text,"",160) ; tạo độ mờ cho splash text trên
  For $i = 1 to $read[0][0] ; chạy vòng lặp for từ 1 đến n (n là tổng số key tìm được trong section MOUSE)
   ControlSetText($text, "", "Static1", "Còn "&Number($read[0][0]) - $i&' giây') ; set text cho Splash Text, xem trong file help
   $pos = StringSplit($read[$i][1],',') ; tách giá trị tại key $i theo dấu "," để thu được x và y (do lúc đầu ta lưu giá trị key $i với dạng "x,y"
   If @error Then ContinueLoop ; nếu có lỗi xảy ra khi tách chuỗi thì bỏ qua dòng lệnh bên dưới, tiếp tục vòng lặp
   If $pos[0] <> 2 Then ContinueLoop ; nếu số lượng tách được khác 2 thì bỏ qua dòng lệnh bên dưới, tiếp tục vòng lặp (do tách được x và y thì số lượng phải = 2)
   MouseMove(Number($pos[1]),Number($pos[2])) ; di chuyển chuột tới vị trí x, y. Number() để ép kiểu chuỗi thành kiểu số
   Sleep(1000)
  Next
  SplashOff() ; tắt splash text, xem trong file help
  MsgBox(64,"Thông báo","Đã giả lập hoàn tất")
 Else
  Exit
 EndIf
WEnd
Từ những bước làm cơ bản này, bạn có thể phát triển chương trình lên một mức mới.

Chúc mọi người thành công với những chia sẽ về ngôn ngữ lập trình AutoIT của bản thân nhé. Hiện bộ Source Code về tiện ích này mình bị mất nên không thể chia sẽ đến mọi người, khi nào mình có cơ hội mình sẽ viết bài chia sẽ chương trình này và có bản demo cho anh chị em kiểm tra thử nhé.

Post a Comment

✔ Bình luận có dấu, lịch sự và đúng chủ đề
❌ Không spam link, quảng cáo, từ ngữ phản cảm
❌ Không hỏi link tải, crack, nội dung vi phạm
⚠ Bình luận vi phạm sẽ bị xóa mà không báo trước

Thêm hình ảnh: [img] link hình ảnh [/img]
Thêm video youtube: [youtube] link video [/youtube]
Thêm code: [code] Đoạn code đã mã hóa [/code]

أحدث أقدم