Bài viết này sẽ thực hiện dựa trên ý tưởng của bài tập 5 - buổi 3 khóa học vỡ lòng AutoIT.
📕 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:
🚀 LET'S DO IT
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: section là MOUSE, key là $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, dưới đây là một ví dụ:Bạn có thể tải và tham khảo chương trình hoàn thiện này tại đây