Professional Documents
Culture Documents
Auto It
Auto It
Ngôn ngữ lập trình AutoIt đã du nhập vào nước ta cũng đã vài năm nay , thông qua mấy con virus
làm rùm beng trên mạng , khiến tôi cũng háo hức muốn tìm hiểu cái ngôn ngữ này như thế nào mà
lợi hại vậy . Sau một thời gian mò mẫm thì tôi cũng chẳng biết được bao nhiêu cả , tuy nhiên kinh
nghiệm học được thì đủ để tôi soạn ra cái tài liệu này. Để làm gì à ? Chẳng qua là có nhã ý muốn
giúp cho bạn nào đang tìm hiểu về AutoIt thì sẽ tiết kiệm được nhiều thời gian , thay vì phải ngồi
dịch mấy trang tài liệu bằng tiếng Anh . Chứ chẳng phải vẽ đường cho các bạn tạo ra mấy cái thứ
"ác ôn" để mà quậy phá người khác.
Cái thằng AutoIt này đúng là tương đối dễ học và dễ hiểu nhưng chỉ là cái vỏ bên ngoài thôi. Tuy
nhiên đối với các bạn nào mới bước vào học lập trình thì sẽ không phải quá vất vả và đau đầu. Thật
sự mà nói thì sức mạnh thật sự của AutoIt nằm bên trong những hiểu biết của bạn về guồng máy
Windows như là : registry , dll, GUI, .... và tôi thì chưa hiểu nhiều đến vậy. Cho nên cái quyển ebook
này chỉ cung cấp cho bạn những gì được gọi là cơ bản , là nền tảng của một ngôn ngữ lập trình thôi.
Tài mọn viết lách của tôi chẳng có là bao , nếu có chố nào "bậy" trong tài liệu này thì rất mong
các bạn thông cảm và gửi thông tin đóng góp để tôi có thể chỉnh sửa . Hy vọng là sau một thời gian
các bạn sẽ nắm trong tay một công cụ hữu ích và mạnh mẽ cho việc học và vọc của mình.
Chương 1
Giới thiệu
• File mã có thể được biên dịch thành một file thi hành duy nhất
• Gọi một cách có định hướng các DLL mở rộng và các hàm API
3
1.2. CẤU TRÚC THƯ MỤC CÀI ĐẶT AUTOIT Chương 1. Giới thiệu
AutoIt được thiết kế sao cho nhỏ nhất có thể và không cần dùng đến các file DLL mở rộng hoặc
Registry để nó có thể an toàn khi chạy trên các Server. Các file script (mã, kịch bản) có thể được
biên dịch thành file exe với công cụ Aut2Exe.
Sự kết hợp các COM và DLL từ việc gọi AutoItX cho phép bạn thêm các tính năng độc nhất vào
các đoạn script hay ngôn ngữ lập trình yêu thích.
Sử dụng AutoIt
• Khi viết script trong SciTe, bạn cần phải lưu lại trước khi nhấn phím F5 để chạy. File nguồn
có đuôi là au3.
• Để viết và hiển thị được tiếng Việt, bạn vào "File > Encoding" sau đó chọn UCS -2 Little
Endian hoặc UCS-2 Big Endian.
• SciTe sẽ hiển thị các dòng lệnh của bạn với nhiều màu sắc khác nhau, tùy theo thành phần
cú pháp. Nếu bạn cảm thấy các màu sắc hiển thị không vừa ý thì có thể sử dụng công cụ
SciTeConfig để chỉnh lại. Công cụ này có sắn trong phiên bản full của SciTe hoặc tải riêng lẻ
từ Download AutoIt.
• Nếu bạn không thích dùng SciTe để soạn script thì có thể dùng các công cụ biên soạn miễn
phí khác như Crimson Editor hoặc Source Edit nhưng sẽ phải thực hiện cấu hình việc khai báo
chương trình chạy file au3 và trình biên dịch.Các file cú pháp được viết sẵn do AutoIt cung
cấp có thể dùng cho nhiều trình soạn thảo và chúng được chứa trong trong thư mục Extra
(...\AutoIt v3\Extra)
• Cách 1 : Bạn cần gọi công cụ Aut2Exe. Vào menu "Start > All programs > AutoIt v3 >
Compile scritpt to exe" và làm theo hướng dẫn của mẫu form.
5
2.2. BIÊN DỊCH SCRIPT Chương 2. Sử dụng AutoIt
• Cách 2 : Từ trình soạn thảo SciTe bạn vào Tool > Compile hoặc nhấn Ctrl + F7
• Cách 3 : Nhấp phải chuột vào file nguồn (au3) và chọn Compile Script.
3.1 Toán tử
AutoIt hỗ trợ các toán tử gán, tính số học, so sánh, và logic. Nếu trong biểu thức cần xử lý có sử
dụng nhiều toán tử thì chúng sẽ được thực hiện theo thứ tự trước sau. Việc tính toán thường được
thực hiện từ trái qua phải và tuân theo các qui tắc chung của đại số. Bên dưới là thứ tự ưu tiên của
các toán tử :
Toán tử Miêu tả
= Phép gán. Vd : $var = 5 (gán 5 vào biến$var)
+= Tăng. Vd : $var += 2 (tăng biến $var lên 2 đơn vị, tương đương với $var =
$var+2)
-= Giảm. Vd : $var -= 1 (giảm biến $var xuống 1 đơn vị, tương đương $var = $var
-1)
*= Nhân.
/= Chia
&= Nối thêm chuỗi. Vd : $var = "one", và sau đó $var & = 10 ($var sẽ bằng "one10"
)
+ Cộng hai số. Vd : 10 + 20 (bằng 30)
- Trừ hai số. Vd : 20 - 10 (bằng 10)
* Nhân hai số. Vd : 20 * 10 (bằng 200)
/ Chia hai số. Vd : 20 / 10 (bằng 2)
& Ghép hai chuỗi với nhau. Vd : "one" & 10 (bằng "one10" )
b Lũy thừa. Vd : 2 b 4 (bằng 16)
= So sánh bằng (không phân biệt chữ hoa và chữ thường khi so sánh chuỗi). Vd :
If $var= 5 Then (trả về true nếu biến $var mang giá trị 5)
== So sánh bằng (có phân biệt chữ hoa, chữ thường khi so sánh chuỗi.)
<> Khác hoặc Không bằng.
> Lớn hơn.
>= Lớn hơn hoặc bằng
< Nhỏ hơn
<= Nhỏ hơn hoặc bằng
AND Logic Và (cả hai). Vd : If $var = 5 AND $var2 > 6 Then (Điều kiện trả về True
nếu $var bằng 5 Và $var2 lớn hơn 6 )
OR Logic Hoặc. Vd : If $var = 5 OR $var2 > 6 Then (Trả về True nếu $var bằng 5
Hoặc $var2 lớn hơn 6)
NOT Logic Phủ định. Vd : NOT 1 (trả về False)
7
3.2. KIỂU DỮ LIỆU Chương 3. Tham khảo ngôn ngữ
NOT
^
* /
+ -
&
< > <= >= = <> ==
AND OR
Nếu một chuỗi được sử dụng như một số, một phép gọi hàm Number()nên được thực hiện. Và nếu
như ký tự đầu tiên của chuỗi không phải là một ký số thì sẽ trả về một số 0. Ví dụ :
10 * "abc" sẽ trả về số 0
10* number("abc") cũng trả về 0
10* number("25ghj") sẽ trả về 250
Nếu một chuỗi được sử dụng trong kiểu boolean (True/False) và nó là một chuỗi rỗng "" thì sẽ được
xem như bằng 0 (False).
Chú ý :
• Hệ hexa trong AutoIt phải bắt đầu với 0x và theo sau là các ký số từ 0 đến 9 hoặc/và các ký
tự a, b, c, d, e, f.
• Khi tính toán các biểu thức số, bạn không cần quan tâm đến việc giới hạn của kiểu dữ liệu.
Nếu kết quả là số nguyên, AutoIt sẽ trả về cho bạn số nguyên. Nếu kết quả là số thập phân,
AutoIt sẽ trả về giá trị thập phân. Ở dạng thập phân, giá trị lớn nhất có thể chứa là (264 -
1)/2.
• Một số hàm trong AutoIt chỉ làm việc với số nguyên 32 bit (mang giá trị từ 0 đến 232 -1) và
các số này sẽ được chuyển đổi tự động, tùy vào hàm sử dụng. Ví dụ như BitAnd.
Tùy vào mục đích của người dùng mà các thành phần có thể có hoặc không trong chương trình. Như
ví dụ trên, ta thấy không có phần chỉ định thư viện bởi vì ta chỉ sử dụng các hàm được thiết kế sẵn,
luôn có trong chương trình chính (như hàm MsgBox ). Thư viện chỉ cần thiết khi ta gọi các hàm mở
rộng, thông thường là trong việc thiết kế GUI (Graphic User Interface - giao diện người dùng) hoặc
các hàm tiện ích. Khai báo và sử dụng biến là cần thiết nếu như ta muốn lưu các dữ liệu, giá trị để
chương trình hoạt động. Và hàm, tất nhiên là không thể thiếu nếu như bạn viết các chương trình
phức tạp và có tần suất sử dụng lại nhiều lần một tác vụ nào đó.
Ví dụ nêu trên chỉ là một đoạn mã đơn giản, nó không thể thể hiện hết tất cả các chức năng trong
AutoIt. Nhưng ta cũng phân tích sơ bộ để hiểu vấn đề. Hai dòng lệnh đầu tiên là dòng ghi chú,
thường dùng để miêu tả giải thích chức năng của một đoạn mã hay câu lệnh nào đấy. Dòng thứ ba
là khai báo biến. Dòng thứ tư là gán giá trị cho biến. Hai dòng còn lại là gọi và sử dụng hàm hiển
thị thông điệp.
• AutoIt là một ngôn ngữ kịch bản hoạt động theo cách thông dịch, các lệnh được đọc và thực
hiện một cách tuần tự. Có nghĩa là đọc đến đâu thì thực hiện đến đó, không đọc hết một lượt
như các ngôn ngữ C hay Pascal.
• AutoIt không có ký hiệu ngăn cách các câu lệnh với nhau, cho nên mỗi câu lệnh phải được viết
trên một dòng, câu lệnh thứ hai phải được viết ở dòng kế tiếp (trong c và pascal thì sử dụng
dấu chấm phẩy ; để ngăn cách các câu lệnh)
• AutoIt không phân biệt chữ hoa và chữ thường đối với các lệnh được viết (ngoại trừ Title của
cửa sổ, xem phần Window Title). Ví dụ, biến $var, $VAR và $VaR chỉ là một biến
• Tất cả các thành phần liên quan đến việc tạo và xử lý cửa sổ được AutoIt hỗ trợ rất mạnh,
chúng là các hàm chức năng tương ứng. Tuy nhiên, trong giới hạn của ebook, tôi không thể
hướng dẫn tất cả các hàm. Tham khảo và tự dịch trong file help là một cách tự học hiệu quả.
• Comment hay chú thích là thành phần rất hay dùng khi lập trình, đối với hầu hết các ngôn
ngữ chúng dùng để diễn đạt chức năng của một đoạn lệnh hay đánh dấu nhằm dễ đọc, dễ quan
sát đối với việc trình bày. Chúng không hề có chức năng thi hành và sẽ được trình điều khiển
bỏ qua khi đọc đến. Và AutoIt hỗ trợ hai dạng chú thích. Chú thích theo dòng (sử dụng dấu
chấm phẩy để báo hiệu) và chú thích theo đoạn (sử dụng cặp #cs.. #ce) để rào các dòng chú
thích bên trong. Ví dụ :
#ce
MsgBox(0, "msg", "Welcome to AutoIT")
Global
Chỉ định khai báo một biến có phạm vi toàn cục. Nghĩa là mọi nơi trong chương trình đều có thể
truy xuất, chỉnh sửa nội dung của biến này. Và biến này sẽ tồn tại cho đến khi chương trình thoát
ra. Ví dụ :
Global $m = "Hello world"
MsgBox(0, "MSG", $m)
_RepText()
MsgBox(0, "MSG", $m)
; định nghĩa hàm
Func _RepText()
$m &= ", " &$m
EndFunc
Đầu tiên ta tạo ra một biến $m và cho hiển thị nội dung của nó là " Hello world". Sau đó hàm
_RepText() được gọi để lặp lại nội dung của biến $m. Hàm MsgBox thứ hai sẽ hiển thị "Hello world,
Hello world". Do $m là biến toàn cục nên ta có thể sửa đổi tùy ý giá trị của nó.
Local
Chỉ định khai báo một biến có phạm vi cục bộ. Tức là nó chỉ được phép sử dụng, thao tác ở phạm
vi giới hạn trong chương trình, thường là ở bên trong các hàm. Nó sẽ được khởi tạo khi hàm được
gọi và sẽ bị hủy khi hàm kết thúc. Những nơi khác trong chương trình không hề biết sự tồn tại của
biến Local này. Ví dụ :
; chương trình sau sẽ chạy command line
_ExeProg() ; sẽ thực thi cmd
Run($prog) ; dòng này sẽ báo lỗi
Func _ExeProg()
Local $prog = "cmd"
Run($prog)
EndFunc
Trong chương trình trên, sau khi hàm _ExeProg() được gọi và thực hiện xong thì biến cục bộ $prog
bị hủy, cho nên lệnh Run($prog) không được thực thi vì $prog bên ngoài không mang một giá trị
nào. Nói cách khác $prog bên trong hàm _ExeProg và $prog bên ngoài hoàn toàn khác nhau.
Bạn chú ý một điều là, nếu bên trong một hàm, bạn khai báo một biến cục bộ cùng tên với một
biến toàn cục thì biến cục bộ sẽ được ưu tiên sử dụng thay vì biến toàn cục. Khi nào tìm hiểu đến
phần định nghĩa hàm, bạn sẽ hiểu rõ hơn về biến cục bộ. Vì trong hàm rất thường sử dụng biến local
để tính toán, lưu trữ giá trị.
Dim
Tạo ra một biến có phạm vi cục bộ (local) nếu như biến này chưa được khai báo trước đó ở dạng
toàn cục (global). Có nghĩa là :
Nếu khai báo biến bên ngoài hàm thì nó có phạm vi toàn cục. Ví dụ :
Nếu khai báo bên trong hàm thì phạm vi là cục bộ. Tuy nhiên, nếu biến Dim này cùng tên với một
biến Global, thì nội dung của biến Global sẽ bị viết đè. Điều này bạn nên chú ý.
Ví dụ :
; đoạn mã này sẽ duyệt thư mục Temp thay vì thư mục Windows
Global $explore = "Explorer " & @WindowsDir
function()
Run($explore)
Func function()
Dim $explore = "Explorer " & @TempDir
EndFunc
Trong các ví dụ trên, ta thấy rằng việc khai báo một biến có thể kết hợp với việc khởi tạo giá trị ban
đầu cho biến đó. Theo mặc định, nếu bạn không gán giá trị khi khai báo thì biến đó mang giá trị 0
(nếu sử dụng như một kiểu number) hoặc "" (nếu sử dụng như một kiểu string).
Dù rằng AutoIt cho phép bạn sử dụng một biến không cần khai báo, nhưng sẽ thật không hay khi
chương trình của bạn có nhiều biến được tạo rải-rác ở nhiều nơi. Tính trật tự và thống nhất sẽ không
đạt hiệu quả vì bạn khó kiểm soát được các đối tượng của mình trong hàng tá dòng lệnh đan xen
nhau. Cũng xin nói thêm, nếu bạn sử dụng một biến không có khai báo trước đó, tùy trường hợp
vận dụng, thì hoặc là chương trình sẽ báo lỗi, hoặc là biến đó sẽ được tạo tự động với phạm vi cục
bộ (Local). Nếu bạn khai báo một biến Local bên ngoài hàm thì nó vẫn có phạm vi như Global.
Khi khai báo một biến, bạn nên chỉ định rõ phạm vi là Local hoặc Global, nên hạn chế dùng Dim.
Trừ khi bạn nắm rõ được tất cả các biến trong chương trình của mình, nhằm tránh các lỗi về việc
chỉnh sửa dữ liệu không mong muốn có thể xảy ra.
Chú ý : bạn không thể khai báo một hằng số trùng tên với một biến đang tồn tại.
3.5 Mảng
3.5.1 KHAI BÁO MỘT MẢNG
Mảng thực chất là một tập hợp các biến có cùng kiểu dữ liệu được gọi chung bằng một tên. Các
biến trong một mảng thường được gọi là "phần tử" và được truy cập đến bởi chỉ mục. Các mảng có
thể có một hay nhiều chiều, thông dụng nhất là mảng một chiều (danh sách) và mảng hai chiều (ma
trận gồm hàng và cột).
• <var_name> : là tên biến đại diện cho tất cả các phần tử trong mảng. Tuân thủ theo các qui
tắc đặt tên như khai báo biến.
• <size> : cho biết có tối đa bao nhiêu phần tử sẽ chứa trong mảng.
Ví dụ như, để khai báo một mảng toàn cục có 100 phần tử gọi tên là List và sau đó gán các giá trị
cho mảng, ta sử dụng câu lệnh :
Global List[100]
List[0] = "Ant"
List[1] = "Bird"
List[2] = "Cat"
.....
List[99] = "Zebra"
Trong AutoIt, chỉ mục đầu tiên của mảng phải bắt đầu từ 0. Với ví dụ trên, nếu ta dùng List[0],
List[1] là ta đang truy cập đến phần tử thứ nhất, thứ hai. Dùng List[99] là ta đang truy cập đến phần
tử thứ 100. Việc sử dụng chỉ mục vượt quá chỉ mục tối đa cho phép khi khai báo là không hợp lệ.
Muốn lấy một giá trị từ một phần tử trong mảng, ta phải biết được chỉ mục của phần tử chứa giá
trị đó. Ví dụ :
Ví dụ :
0 1 2
0 2 4 6
1 1 3 5 ←−$matrix[1][2]
Để truy cập đến một phần tử trong mảng ta cũng sử dụng chỉ mục cho dòng và cột. Ví dụ :
; đang truy cập đến phần tử ở dòng thứ nhất, cột thứ hai.
$n = $matrix[0][1] ; $n sẽ bằng 4
Trong đó,
$array : là tên của một biến mảng
$dimension : cho biết cần lấy ở chiều thứ mấy. Mặc định là 1, tức mảng một chiều. Nếu gán bằng
0, thì UBound không trả về tổng số phần tử hiện có, mà sẽ trả về một số tương ứng với số chiều của
mảng.
Ví dụ :
Dấu _ đặt ở cuối dòng lệnh $info = ... cho biết, phần tiếp theo của dòng lệnh hiện hành được viết
ở dòng kế tiếp. Thông thường việc này xảy ra do một lệnh quá dài, khi viết trên một dòng thì vượt
quá trang màn hình, rất khó quan sát. Cho nên cách này được dùng như một giải pháp.
Đầu tiên ta khai báo mảng $a có năm phần tử, sau đó dùng vòng lặp For thứ nhất để in nội dung
ra console. Đến dòng lệnh ReDim $a[3] sẽ định lại kích thước của mảng từ ban đầu là năm phần tử
xuống còn ba phần tử. Khi kích thước mới nhỏ hơn kích thước cũ, thì phần nội dung phía sau sẽ bị
cắt bỏ. Cho nên vòng lặp For thứ hai sẽ chỉ in các giá trị 2, 4 và 6.
Chú ý : Khi thiết lập lại kích thước cho một biến mảng, nếu bạn thay đổi số chiều của mảng từ
mảng một chiều thành hai chiều, hoặc ngược lại, thì tất cả dữ liệu đang có trong mảng sẽ bị xóa
hoàn toàn.
+ Theo lý thuyết, các phần tử trong mảng phải có cùng kiểu dữ liệu, hoặc là số, hoặc là chuỗi. Nhưng
trong AutoIt, một mảng có thể chứa mọi thứ, từ một số cho đến một boolean. Nói đơn giản là có thể
chứa các phần tử có kiểu dữ liệu khác nhau. Tuy nhiên, điều này không được khuyến khích. Ví dụ :
$arr[0] = 1
$arr[1] = true
$arr[2] = "my text"
$arr[3] = $another_array
+ Một mảng trong AutoIt chỉ cho phép chứa tối đa 22 4 (16 777 216) phần tử.
3.6 Marco
Macro hiểu đơn giản là các lệnh ngắn gọn được thiết kế sẵn để lấy các thông tin từ hệ thống hoặc
ứng dụng. Giá trị của chúng có thể không cố định vì phụ thuộc vào vào hệ thống. Trong AutoIt, các
macro được bắt đầu với ký tự @ và theo sau tên của macro. Bên dưới là các Macro thường được dùng
.
@MSEC Mili giây hiện tại của đồng hồ hệ thống. Vùng giá trị từ 00 đến 999
@SEC Giây hiện tại. Vùng giá trị từ 00 đến 59
@MIN Phút hiện tại. Vùng giá trị từ 00 đến 59
@HOUR Giờ hiện tại, theo dạng 24 giờ. Vùng giá trị từ 00 đến 23
@MDAY Ngày hiện tại trong tháng. Vùng giá trị từ 01 đến 31
@MON Tháng hiện tại. Vùng giá trị từ 01 đến 12
@YEAR Bốn ký số của năm hiện hành
@WDAY Thứ trong tuần. Vùng giá trị từ 01 đến 7, tương ứng : 1=CN, 2= Thứ 2,...
Ngày hiện tại là ngày thứ bao nhiêu trong năm. Vùng giá trị từ 01 đến 366
@YDAY
(hoặc 365 nếu không phải năm nhuận)
Áp dụng cho tất cả người dùng (All User). Các giá trị đọc từ :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
@AppDataCommonDir đường dẫn đến thư mục Application Data
@DesktopCommonDir đường dẫn đến thư mục Desktop
@DocumentsCommonDir đường dẫn đến thư mục Documents
@FavoritesDir đường dẫn đến thư mục Favorites
@ProgramsDir đường dẫn đến thư mục Programs (thư mục trên Start Menu)
@StartMenuDir đường dẫn đến thư mục Start Menu
@StartupDir đường dẫn đến thư mục Startup
@ UserProfileDir đường dẫn đến thư mục Profile
Phần này lấy các thông tin liên quan đến hệ thống máy tính
@HomeDrive Ký tự của ổ đĩa chứa thư mục home của user
@HomePath Một phần đường dẫn đến thư mục home. Sử dụng thêm
@HomeDrive&"\" để có đường dẫn đầy đủ
@HomeShare Thư mục home chứa tên Server và tên chia sẻ.
@LogonDNSDomain DNS Domain đã đăng nhập
@LogonDomain Domain đã đăng nhập.
@LogonServer Server đã đăng nhập
@ProgramFilesDir Đường dẫn đến thư mục Program Files
@CommonFilesDir Đường dẫn đến thư mục Common Files
@WindowsDir Đường dẫn đến thư mục Windows
@SystemDir Đường dẫn đến thư mục System của Windows (hoặc System32)
@TempDir Đường dẫn đến thư mục chứa các file tạm
@ ComSpec Giá trị của %comspec%, (SPECified secondary COMmand interpreter)
dùng cho command line, ví dụ : Run(@ComSpec & " /k help | more")
@CPUArch Trả về "x86" cho CPU 32 bit và "x64" cho CPU 64 bit
@KBLayout Trả về mã hiển thị của bàn phím. Xem trong Appendix để biết giá trị
@OSArch Trả về một trong các giá trị sau : "X86", "IA64", "X64" - cho biết kiến trúc
của hệ điều hành đang chạy.
@OSLang Trả về mã hiển thị của hệ điều hành. Xem trong Appendix
@OSType Trả về "WIN32_NT" cho Windows NT/2000/XP/2003/Vista/2008
@OSVersion Trả về một trong các giá trị sau : "WIN_2008", "WIN_VISTA",
"WIN_2003", "WIN_XP", "WIN_2000".
@OSBuild Trả về số xây dựng của Hệ điều hành. Ví dụ, Windows 2003 Server trả về
3790
@OSServicePack Gói dịch vụ của hệ điều hành dạng như "Service Pack 3" hoặc, đối với
Windows 95, nó có thể trả về "B"
@ComputerName Tên mạng của máy tính.
@UserName ID của người dùng đã đăng nhập hiện hành .
@IPAddress1 Địa chỉ IP của card mạng thứ nhất. Có thể trả về 127.0.0.1 trên vài máy
tính
@IPAddress2 Địa chỉ IP của card mạng thứ hai. Returns 0.0.0.0 nếu không dùng được
@IPAddress3 Địa chỉ IP của card mạng thứ ba. Returns 0.0.0.0 nếu không dùng được
@IPAddress4 Địa chỉ IP của card mạng thứ tư. Returns 0.0.0.0 nếu không dùng được
@DesktopHeight Chiều cao của màn hình desktop (pixel)
@DesktopWidth Chiều rộng của màn hình desktop (pixel)
@DesktopDepth Độ sâu của màn hình desktop (tính theo bit)
@DesktopRefresh Tần số làm tươi của màn hình, tính theo hezt (hz)
Như trình bày ở trên ta thấy rằng, một khối lệnh If phải được bắt đầu với If... Then và kết thúc với
EndIf.
<điều kiện> là một biểu thức so sánh (có sử dụng các toán tử so sánh, logic như : <, >, <> ,
=,...And, Or, Not) hoặc một biểu thức thường có trả về giá trị. Nếu điều kiện trả về True thì <các
câu lệnh> sau Then được thực hiện. Nếu ngược lại thì <các câu lệnh> sau Else được thực hiện,
không bao giờ xảy ra hai trường hợp cùng một lúc. Cũng xin nhắc lại, nếu <điều kiện> trả về một
giá khác 0 thì có nghĩa True, bằng 0 là False.
<các câu lệnh> có thể là một hay nhiều dòng lệnh, hoặc cũng có thể là lệnh rỗng. Hoặc cũng có
thể là một khối điều kiện If khác.
Mệnh đề Else thì tự chọn, có thể có hoặc không. Nếu Else không tồn tại thì khi <điều kiện> là
False thì chương trình sẽ thực hiện tiếp các lệnh nằm sau EndIf.
Ví dụ đơn giản sau xét xem số chỉ định là chẵn hay lẻ.
$n = 101
If Mod($n, 2)=0 Then
MsgBox(0, "Ket qua", $n & " là số chẵn")
Else
MsgBox(0, "Ket qua", $n & " là số lẻ")
EndIf
Hàm Mod có chức năng tìm số dư của phép chia giữa $n và 2. Cú pháp chung là Mod( a, b). Trong
đó a là số bị chia và b là số chia.
20
4.1. CÂU LỆNH ĐIỀU KIỆN IF Chương 4. Câu lệnh điều kiện
$n = 1010
If Mod($n, 2)=0 Then
If 100<=$n And $n<=999 Then
MsgBox(0, "Ket qua", $n & " là số chẵn có 3 chữ số")
Else
MsgBox(0, "Ket qua", $n & " là số chẵn không phải 3 chữ số")
EndIf
Else
If 100<=$n And $n<=999 Then
MsgBox(0, "Ket qua", $n & " là số lẻ có 3 chữ số")
Else
MsgBox(0, "Ket qua", $n & " là số lẻ không phải 3 chữ số")
EndIf
EndIf
Xin nói luôn với các bạn một điều, cú pháp này mới chính là cú pháp tổng quát nhất của khối lệnh
If. Hai phần : “Dạng chung của If” và “Các if lồng nhau” thực chất được tách từ đây mà ra. Cho nên
từ đây trở đi, khi sử dụng If bạn chỉ cần quan tâm đến phần này. Đến đây cũng xin giải thích lại để
bạn hiểu và ghi nhớ.
Các <điều kiện> được thẩm định từ trên xuống. Nếu <điều kiện 1> là True, thì <các câu lệnh
1> được thi hành. Ngược lại thì kiểm tra <điều kiện 2> , nếu đúng thì thi hành <các câu lệnh 2>.
Việc ước lượng được xét dần đến <điều kiện n>. Nếu sau tất cả các lần thẩm định, không một điều
kiện nào thỏa mãn và Else có tồn tại, thì các lệnh sau Else được thi hành. Ví dụ sau minh họa rõ
việc dùng khối If tổng quát .
Dim $var = ’-5’
If $var > 0 Then
MsgBox(4096,"", "Value is positive.")
ElseIf $var < 0 Then
MsgBox(4096,"", "Value is negative.")
Else
If StringIsXDigit ($var) Then
MsgBox(4096,"", "Value might be hexadecimal!")
Else
MsgBox(4096,"", "Value is either a string or is zero.")
EndIf
EndIf
Chú ý:
• Trong trường hợp câu lệnh If bạn sử dụng, chỉ có một lệnh sau Then và không có phần Else thì
có thể viết gọn như sau :
If <điều kiện> Then <câu lệnh>
Ví dụ :
$v=’05’
if StringIsDigit($v) Then MsgBox(0,’msg’,’It is a number’)
; các lệnh không thuộc If có thể viết tiếp ở đây
• Trong các câu lệnh điều kiện (như If) thì việc dùng dấu ngoặc đơn ( ) là không thể thiếu nếu
như bạn muốn thẩm định các điều kiện một cách chính xác, vài bài toán yêu cầu được kiểm tra
với nhiều điều kiện lồng vào nhau, một kết quả không mong muốn có thể được đưa ra nếu như
bạn không gom nhóm các điều kiện hoặc gom nhóm không đúng. Bạn xem ví dụ sau cho thấy
cách thức xét điều kiện của khối If thứ nhất và khối If thứ hai là hoàn toàn khác nhau :
Giải thích
<điều kiện> : cũng tương tự như khối lệnh If, cũng sử dụng các toán tử so sánh và logic.
<các câu lệnh> : có thể là bất cứ lệnh gì, kể cả các khối Select , Switch hay If khác đều được.
Case Else : có thể có hoặc không.
Hình thức xét điều kiện cũng bắt đầu từ trên xuống. Kiểm tra <điều kiện 1> nếu thỏa thì thực
hiện <các câu lệnh> sau nó. Ngược lại, thì xét <điều kiện 2>, <điều kiện 3>, cho đến <điều kiện
thứ n>. Nếu không có <điều kiện> nào thỏa thì <các câu lệnh> sau Case Else sẽ được thực thi,
nếu như Case Else được thiết lập. Trong trường hợp có nhiều <điều kiện> đúng, thì chỉ <điều kiện>
đúng đầu tiên được tìm thấy mới được thi hành.
Ví dụ 1 :
$s = 3
$n = 5
Select
case IsString($s)
MsgBox(0,"msg", "$s là chuỗi")
Case $n<>0
MsgBox(0,"msg", "$n là số khác 0")
Case Else
MsgBox(0,"msg", "$s không là chuỗi. $n không là số")
EndSelect
Hàm IsString xét xem một giá trị nào đó có phải là chuỗi hay không. Nếu đúng trả về 1, ngược lại
trả về 0. Ví dụ 2:
4.3.3 Chú ý
• <value1> To <value2> hoặc <value n-1> To <value n> là một miền giá trị. Nếu bạn không
muốn chỉ định các miền giá trị cho Case thì có thể chỉ định những giá trị cụ thể, mỗi giá trị
cách nhau bởi dấu phẩy. Từ khóa To và các phần sau nó thì tùy, có thể có hoặc không.
• <các câu lệnh> có thể là bất cứ một lệnh gì, thậm chí là nhiều khối Switch lồng nhau.
4.3.4 Ví dụ
Đoạn mã sau sẽ lấy giờ của hệ thống và suy ra thời điểm hiện tại trong ngày
Switch @HOUR
Case 6 To 11
$msg = "Good Morning"
Case 12 To 17
$msg = "Good Afternoon"
Case 18 To 21
$msg = "Good Evening"
Case Else
$msg = "What are you doing now ?"
EndSwitch
MsgBox(0, Default, $msg)
4.4 CONTINUECASE
Theo như mặc định, thì trong khối lệnh Switch và Select sẽ dừng việc kiểm tra điều kiện và kết
thúc nếu gặp được một Case trả về giá trị True. Tuy nhiên trong một vài tình huống, bạn lại không
muốn kết thúc khối lệnh Select hay Switch khi gặp một trường hợp đúng, bạn muốn nó vẫn thực hiện
kiểm tra các Case phía sau để làm một công việc nào đấy. Thông thường, đối với một Case thỏa điều
kiện và đang thi hành các lệnh liên kết với nó, thì việc thi hành chỉ dừng lại khi gặp một lệnh Case
tiếp theo hoặc lệnh EndSwitch hay EndSelect.
Thì ở đây, AutoIt hỗ trợ cho bạn từ khóa ContinueCase để dừng việc thực hiện một Case hiện tại
và duyệt đến các lệnh nằm trong Case tiếp theo.
Cú pháp:
Ví dụ sau sử dụng hàm InputBox và cờ lỗi @error của nó để minh họa việc dùng ContinueCase.
$msg = ""
$w = InputBox(Default, "Please enter a word.", "", " M", Default,
Default, Default, Default, 5)
Switch @error
Case 2
$msg = "Timeout "
ContinueCase
Case 1 ; Continuing previous case
$msg &= "Cancellation"
Case 0
Switch $w
Case "a", "e", "i", "o", "u"
$msg = "Vowel"
Case "QP"
$msg = "Mathematics"
Case "Q" to "QZ"
$msg = "Science"
Case Else
$msg = "Others"
EndSwitch
Case Else
$msg = "Something went horribly wrong."
EndSwitch
MsgBox(0, Default, $msg)
Hàm InputBox sẽ hiện ra trong vòng 5 giây để chờ bạn gõ một ký tự. Sau 5 giây, nếu bạn không thao
tác gì, hộp thoại sẽ tự đóng và hiện thông báo “Timeout Cancellation”. Nếu bạn nhấn nút Cancel thì
hiện thông báo “Cancellation”. Nếu bạn gõ một từ hay ký tự và nhấn OK thì các khối lệnh bắt đầu
từ Case 0 sẽ thực thi để hiện thông báo tương ứng với từ bạn vừa gõ. Cờ lỗi @error cho biết trạng
thái tác động của người dùng đối với hàm InputBox. Bạn xem cú pháp của hàm InputBox trong file
Help hoặc trong mục Hàm của ebook này để hiểu rõ thêm.
Vòng lặp
5.1.2 Chú ý
• Phần Step <step_value> có thể có hoặc không. Nếu không có, thì giá trị mặc định cho
<step_value> sẽ bằng 1. Trường hợp <step_value> là một số âm và <start_value> lớn hơn
<stop_value> thì ta có một vòng lặp đếm ngược.
• Nếu như <stop_value> và <step_value> là các biến, thì giá trị của các biến này chỉ được đọc
một lần ở lần lặp đầu tiên. Ở các lần lặp sau, cho dù bạn thay đổi giá trị cho <stop_value>
hay <step_value> thì chu kỳ lặp vẫn không thay đổi.
26
5.2. VÒNG LẶP WHILE ... WEND Chương 5. Vòng lặp
• Bên trong vòng lặp, nếu bạn sử dụng một biến không có khai báo, thì mặc định nó sẽ được tạo
với phạm vi cục bộ (Local).
• Vòng lặp For sẽ không thực hiện bất kỳ lần lặp nào nếu như :
start_value >stop_value và step_value >= 0
Hoặc start_value < stop_value và step_value là một số âm.
5.1.3 Ví dụ
Đoạn mã sau được dùng để in các con số từ 1 đến 100 lên màn hình console của sciTe.
Đoạn mã sau thực hiện việc đếm ngược và chỉ in các con số chẵn từ 100 về 0
5.2.3 Chú ý
• Số lần thực hiện của vòng lặp sẽ là 0, nếu như ngay bước kiểm tra <điều kiện> lần đầu tiên,
<điều kiện> cho một giá trị False.
• Muốn tạo nên một vòng lặp vô tận, bạn chỉ cần thay thế <điều kiện> bằng một giá trị khác 0.
5.2.4 Ví dụ
Đoạn mã này sẽ hiện 5 lần thông báo cho biết giá trị của biến $i
$i = 0
While $i <= 10
MsgBox(0, "Value of $i is:", $i)
$i = $i + 1
WEnd
MsgBox(0, "Thong bao", "While loop stoped. Script is exiting")
5.3.1 Cú pháp
Do
<các câu lệnh>
........
Until <điều kiện>
5.3.3 Chú ý
Không giống như For và While, cả hai vòng lặp này đều thực hiện việc kiểm tra điều kiện ở phần
đầu của vòng lặp. Vòng lặp Do.. Until thực hiện việc kiểm tra điều kiện sau khi <các câu lệnh> được
thi hành. Điều này có nghĩa là Do...Until luôn thực hiện việc lặp ít nhất một lần.
5.3.4 Ví dụ
Đoạn chương trình sau tính giá trị trung bình một dãy số (không biết trước có bao nhiêu số) do
người dùng nhập vào. Quá trình nhập số kết thúc khi người dùng nhập vào số 0. Biến $sum sẽ cộng
dồn các giá trị được nhập vào, $count sẽ đếm xem đã qua bao nhiêu lần nhập số (tương ứng với số
lần lặp lại).
Global $n, $count=0, $sum=0
Do
$n = InputBox("Get Data", "Please enter a number." &@crlf & "If number is zero, stop ent
$sum += $n
$count += 1
Until $n=0
$count -= 1 ; bỏ qua lần nhập số 0
MsgBox(0,"Result", "Average of sum : " & $sum/$count)
5.4.1 Cú pháp
For <var> In <expression>
<các câu lệnh>
........
Next
5.4.3 Chú ý
• Nếu <expression> là một tập hợp object không có phần tử, thì đoạn script sẽ bỏ qua việc lặp
và <var> sẽ chứa một chuỗi rỗng.
• Nếu <expression> không phải là object, cũng không phải là mảng, thì đoạn script sẽ dừng với
một lỗi được thông báo, trừ khi bạn có sử dụng trình điều khiển COM Error.
• Giả sử trường hợp <expression> bạn dùng là một mảng và bạn có thay đổi giá trị của các phần
tử trong mảng khi For...In đang chạy, thì giá trị đó sẽ không được ánh xạ ngay vào trong mảng.
Chỉ khi For... In kết thúc thì thay đổi đó mới có hiệu lực.
5.4.4 Ví dụ 1
Global $array[4]
$array[0]="w"
$array[1]="x"
$array[2]="y"
$array[3]="z"
For $element In $array
MsgBox(0,"Current $array item",$element)
Next
5.4.5 Ví dụ 2
Đoạn mã sau sẽ thông báo cho bạn biết các cửa sổ Explorer nào đang mở
$oShell = ObjCreate("shell.application")
$oShellWindows=$oShell.windows
if Isobj($oShellWindows) then
$string=""
for $Window in $oShellWindows
$String = $String & $Window.LocationName & @CRLF
next
msgbox(0,"","You have the following windows open:" & @CRLF & $String)
else
msgbox(0,"","you have no open shell windows.")
endif
5.5.1 Cú pháp
With <biểu thức>
<các câu lệnh>
.......
EndWith
5.5.3 Chú ý
Khối lệnh With không cho phép lồng vào nhau.
5.5.4 Ví dụ
Đoạn mã sau sẽ gọi trình duyệt web Internet Explorer với kích thước cửa sổ là 1024 và 768. Đồng
thời truy cập vào trang Google.com
5.6.1 Chú ý
• Khi bạn muốn sử dụng một vòng lặp vô tận thì nên dùng While... WEnd hoặc Do.. Until vì
chúng ngắn gọn hơn For.
• Vòng lặp While chỉ thực hiện lặp khi <điều kiện> trả về True (một giá trị khác 0), cho nên ở
đây ta sử dụng một giá trị đại diện là 1
• Vòng lặp Do thực hiện lặp khi <điều kiện> trả về là False (giá trị 0 - zero), cho nên phần <điều
kiện> ta sẽ thay bằng số 0 để nó không bao giờ là True.
• Trong quá trình cho chạy vòng lặp vô tận và xử lý các lệnh một cách liên tục như vậy sẽ làm
cho hiệu suất của CPU bị chiếm dụng rất cao, khoảng vài chục % (xem ở thẻ Performance trong
Task Manager). Vì vậy, khi sử dụng vòng lặp vô tận bạn phải cẩn thận, và ở vài trường hợp ta
cần tạo ra khoảng dừng giữa hai lần lặp liên tiếp để tránh quá tải cho CPU. Muốn tạo khoảng
dừng, ta sử dụng câu lệnh Sleep <mili giây> , trong đó 1000 mili giây = 1 giây. Tuy nhiên sẽ
làm cho quá trình lặp bị chậm lại, thời gian xử lý sẽ dài hơn.
Đọc đến đây có lẽ bạn sẽ thắc mắc một điều, làm sao dừng lại vòng lặp vô tận ? Câu trả lời nằm
ngay sau đây.
5.7 EXITLOOP
ExitLoop cho phép bạn kết thúc (ngắt) vòng lặp ngay lập tức mà không cần quan tâm đến điều
kiện của vòng lặp. Dạng đầy đủ :
5.7.2 Chú ý
Sử dụng ExitLoop bên ngoài vòng lặp là không được phép. Cũng tương tự như vậy, nếu bạn chỉ
định cho tham số [which loop] một cấp vòng lặp không có (hiểu đơn giản là. . . giả sử như bạn chỉ có
vòng lặp cấp 1, nhưng lại dùng ExitLoop 2 hoặc ExitLoop 3 thì tất nhiên sẽ bị báo lỗi)
5.7.3 Ví dụ
Đoạn mã sau minh họa việc dùng ExitLoop cho vòng lặp hiện hành. Vòng lặp vô tận sẽ cho xuất
hiện hộp thoại Running sum =... , yêu cầu bạn nhập vào một số dương để tính tổng, quá trình lặp
lại cho đến khi nào bạn nhập một số âm. Kết quả được thông báo ra màn hình .
$sum = 0
While 1 ;use infinite loop since ExitLoop will get called
$ans = InputBox("Running sum =" & $sum, _
" Enter a positive number. (A negative number exits)")
If $ans < 0 Then ExitLoop
$sum = $sum + $ans
WEnd
MsgBox(0,"The sum was", $sum)
Ví dụ bên dưới minh họa việc dùng ExitLoop để ngắt vòng lặp cấp 2 (cụ thể là While). Sau khi chạy
sẽ có hai lần xuất hiện thông báo trên màn hình. Bạn chú ý các giá trị $i và $j được thông báo để
hiểu cách làm việc.
$i = 1
While $i<=2 ;đây là vòng lặp cấp 2
For $j=1 To 5 ;đây là vòng lặp cấp 1
If $j=3 Then ExitLoop
MsgBox(0,"msg", "$i = " & $i &" $j = " & $j)
Next
$i += 1
WEnd
5.8 CONTINUELOOP
Không như ExitLoop, lệnh ContinueLoop thực hiện ngay lần lặp kế tiếp của vòng lặp, bỏ qua tất
cả các lệnh đứng sau nó. Có dạng đầy đủ
5.8.2 Chú ý
Cũng như ExitLoop, nếu bạn sử dụng ContinueLoop bên ngoài vòng lặp hoặc chỉ định cho tham
số [which loop] một vòng lặp không có thì sẽ bị báo lỗi.
5.8.3 Ví dụ
Đoạn mã sau minh họa việc dùng ContinueLoop cho vòng lặp cấp 1. Bảng thông báo giá trị $i=2
sẽ không xuất hiện.
For $i=1 To 4
If $i=2 Then ContinueLoop
MsgBox(0, "message", "$i = " & $i)
Next
6.1 Hàm là gì ?
Nói đơn giản, hàm là một chương trình con thực hiện một chức năng cụ thể nào đó trong chương
trình chính.
Tại sao lại gọi là chương trình con ? Bởi vì trong quá trình viết một ứng dụng, tất nhiên sẽ có một
vài đoạn chương trình được dùng đi dùng lại nhiều lần. Ví dụ như bạn cần hiển thị một hộp thoại
chứa thông báo ra màn hình chẳng hạn. Bạn viết nó ở đầu chương trình để hiện thông báo bắt đầu
chạy chương trình, đến cuối chương trình thì viết lại để hiện thông báo kết thúc chương trình. Bạn
thử hình dung nếu có rất nhiều nơi trong chương trình chính của bạn muốn hiển thị thông báo ra
màn hình thì cảm giác của bạn sẽ như thế nào !? Thật chán ngấy và phí thời gian khi phải ngồi gõ
lại từng dòng lệnh cho một công việc là hiển thị thông báo ra màn hình, trong khi ta đã viết nó ở rất
nhiều nơi trong chương trình rồi. Điều này làm cho công việc của bạn không hiệu quả, chương trình
thì dài thêm và càng rối mắt.
Để giải quyết vấn đề này, các nhà tin học đã đưa ra một giải pháp. Đó là, chỉ viết đoạn mã xử lý
công việc ở một nơi nào đó trong chương trình chính. Sau đó, đặt cho nó một cái tên, đưa cho nó các
biến đại diện để tiếp nhận các dữ kiện cần xử lý và chỉ cho nó cách thức để trả về kết quả. Do đoạn
mã này nằm bên trong chương trình chính, cho nên ta gọi nó là chương trình con (theo đúng nghĩa
đen) hay còn gọi là hàm.
Và cuối cùng, khi muốn sử dụng một hàm bạn chỉ cần quan tâm đến cách thức để truyền dữ kiện
cần xử lý cho nó và cách nó trả về một kết quả. Bạn không cần phải bận tâm là bên trong nó làm
việc như thế nào, các dòng lệnh được viết ra sao. Bạn chỉ muốn có kết quả cuối cùng, hàm sẽ làm
việc đó cho bạn.
Đối với AutoIt, thì để hiển thị một hộp thoại thông báo ra màn hình, AutoIt hỗ trợ cho bạn hàm
MsgBox mà bạn đã từng thấy ở các ví dụ. Cũng xin nhắc lại với bạn một điều, sức mạnh của AutoIt
nằm ở việc sử dụng các hàm được định nghĩa sẵn, cho nên nếu bạn muốn tạo một ứng dụng hiệu quả
thì việc định nghĩa và gọi hàm là không thể thiếu.
Thông thường trong các ngôn ngữ khác (như Pascal) thì một hàm có trả về giá trị cụ thể thì vẫn
gọi là hàm. Nhưng nếu hàm đó không trả về một giá trị nào cả, các lệnh bên trong chỉ xử lý những
tác vụ mang tính “thủ tục” nên còn được gọi là thủ tục. Tuy nhiên, AutoIt không có khái niệm thủ
tục, nên dù hàm có hay không trả ra giá trị thì ta vẫn gọi chung là hàm.
34
6.3. ĐỊNH NGHĨA HÀM Chương 6. Hàm người dùng
Các biến được định nghĩa bên trong một hàm thì được gọi là biến cục bộ (Local). Chúng được tạo
ra khi hàm được nạp vào , và sẽ mất khi thoát hàm. Như vậy, một biến cục bộ không thể lưu trữ
giá trị của nó giữa hai lần gọi hàm. Trong trường hợp bạn sử dụng một biến toàn cục (Global) bên
trong hàm thì nội dung của biến toàn cục sẽ thay đổi, và giá trị của nó vẫn giữ nguyên sau khi hàm
kết thúc.
Tất cả các hàm trong AutoIt đều có cùng tầm vực, cho nên bạn không thể định nghĩa một hàm
bên trong một hàm khác.
6.3.2 Chú ý
• Khi khai báo <các tham biến>, bạn không cần đặt vào từ khóa chỉ phạm vi của biến. Theo
mặc định, chúng luôn là cục bộ (local). Thậm chí nếu bạn có chỉ định Dim, Local hay Global
thì cũng sẽ bị báo lỗi. Tuy nhiên, hai từ khóa Const, ByRef lại được phép đặt vào phía trước
mỗi biến trong danh sách các tham biến để mở rộng chức năng của hàm (xem phần “Truyền dữ
kiện cho hàm”).
• Lệnh Return có chức năng chính là chấm dứt ngay quá trình xử lý bên trong hàm và trả về
<giá trị> cho hàm (nếu có). Theo mặc định, AutoIt luôn trả về giá trị cho một hàm. Nếu lệnh
Return <giá trị> được dùng thì hàm sẽ trả về <giá trị>. Hàm trả về 0 (hoặc “ “ nếu dùng ở
string) nếu Return không tồn tại hoặc Return được gọi mà không có phần <giá trị> theo sau.
6.3.3 Ví dụ
Đoạn mã sau thực hiện việc định nghĩa hàm _RepeatText để lặp lại n lần một chuỗi
$str = "abc"
$new_str = _RepeatText($str, 10, "")
MsgBox(0,"_RepeatText 1", "Source : " & $str & @CRLF & "New string : " & $new_str)
$str = "Love"
$new_str = _RepeatText($str, 5, " - ") ; ngăn cách chuỗi bằng " - "
MsgBox(0,"_RepeatText 2", "Source : " & $str & @CRLF & "New string : " & $new_str)
Func _RepeatText($string, $how_many, $delim)
; $string sẽ chứa chuỗi dữ kiện được truyền từ ngoài vào
; $how_many cho biết sẽ lặp lại bao nhiêu lần
; $delim chỉ định ký tự nào dùng để ngăn cách giữa hai chuỗi được lặp lại
Local $Rep_str =""
For $i=1 To $how_many
$Rep_str &= $string & $delim
Next
Return $Rep_str
EndFunc
• Tham biến : là các biến cục bộ, đại diện cho chương trình con để tiếp nhận dữ kiện
• Đối số : thực chất là các dữ-kiện-cụ-thể mà ta truyền cho tham biến của hàm. Tuy nhiên, các
dữ kiện ta truyền cho tham biến không phải lúc nào cũng là một giá trị cụ thể. Thông thường
nó là một biến bên ngoài. Biến bên ngoài này cũng chính là đối số của hàm.
Nói chung, để truyền dữ kiện cho chương trình con ta có hai cách.
• Cách thứ nhất là “truyền bằng trị”, phương pháp này sao chép giá trị của một đối số vào tham
biến, và các thao tác trên tham biến không làm ảnh hưởng đến đối số. Ví dụ :
Hi("Mary")
$nick = "Lovely Cat"
Hi($nick)
Func Hi($name)
$greeting = "Hello, "& $name& ". Have a nice day!"
MsgBox(0,"Hi", $greeting)
EndFunc
• Cách thứ hai là “truyền bằng tham chiếu”, tức là dùng tham biến để thao tác trực tiếp trên đối
số được truyền vào. Mọi thay đổi trên tham biến đều ảnh hưởng đến đối số. Để làm được đều
này ta sử dụng từ khóa ByRef
6.4.1 BYREF
Như đã nói ở trên, khi muốn tham biến liên kết với đối số truyền vào, ta đặt ByRef vào trước tham
biến lúc khai báo.
Ví dụ, đoạn mã này thực hiện việc tráo đổi giá trị giữa hai biến $var1 và $var2 :
$var1 = 100
$var2 = 50
MsgBox(0,"Orginal", "Orginal value : $var1 = " & $var1 & ", $var2 = " & $var2)
_Swap($var1, $var2)
MsgBox(0,"Modified", "Modified value : $var1 = " & $var1 & ", $var2 = " & $var2)
Func _Swap(ByRef $a, ByRef $b)
$temp = $a
$a = $b
$b = $temp
EndFunc
Ban đầu ta truyền vào hàm _Swap hai đối số là $var1 và $var2. Do hai tham số $a, $b có sử dụng
ByRef nên khi ta tráo đổi giá trị giữa $a và $b thì cũng làm cho giá trị của $var1 và $var2 tráo đổi
theo.
6.4.2 CONST
Bạn từng biết rằng, Const là từ khóa dùng để khai báo hằng số. Thì khi sử dụng trong hàm cũng
vậy, việc đặt Const phía trước tham biến, sẽ làm cho giá trị của tham biến không thể thay đổi trong
suốt quá trình thực thi hàm. Giá trị này được truyền chỉ một lần từ phía đối số.
6.4.3 DEFAULT
Từ khóa này không được dùng trong các biểu thức tính toán. Nó được dùng như một cờ thông báo
rằng sẽ sử dụng giá trị mặc định của tham biến đó bên trong hàm. Các tham số sử dụng giá trị mặc
định và các tham số sử dụng giá trị bắt buộc có thể được khai báo xen kẽ nhau, không cần phải theo
trật tự. (xem thêm chú ý số 3 bên dưới)
Ví dụ :
WinMove("[active]","",default, default, 200,300) ; just resize the active window (no move
MyFunc2(Default,Default)
Func MyFunc2($Param1 = Default, $Param2 = ’Two’, $Param3 = Default)
If $Param1 = Default Then $Param1 = ’One’
If $Param3 = Default Then $Param3 = ’Three’
MsgBox(0, ’Params’, ’1 = ’ & $Param1 & @LF & _
’2 = ’ & $Param2 & @LF & _
’3 = ’ & $Param3)
EndFunc
• Để truyền một mảng vào hàm, thì ta chỉ cần nêu ra tên của mảng đó, không cần dùng cặp dấu
ngoặc vuông. Khi xử lý, nếu bạn xác định chiều dài của mảng được truyền vào, ta cần gọi hàm
UBound.
• Lúc khai báo tham biến, bạn có thể gán cho tham biến những giá trị mặc định. Trong quá trình
gọi hàm, nếu người dùng không truyền dữ kiện cho tham biến đó thì giá trị mặc định sẽ được
dùng. Có một lưu ý quan trọng là các tham biến có dùng giá trị mặc định, thì tất cả phải được
đặt ở phía sau các tham biến không dùng giá trị mặc định. Ngoài ra còn có cách dùng từ khóa
Default như đã nêu ở trên.
Include Description
Array.au3 Functions that assist with array management
AVIConstants.au3 AVI Constants
ButtonConstants.au3 Button Constants
Color.au3 Functions that assist with color management
ComboConstants.au3 ComboBox Constants
Constants.au3 Various AutoIt Constants
Date.au3 Functions that assist with dates and times
DateTimeConstants.au3 DateTime Control Constants
EditConstants.au3 Edit Constants
File.au3 Functions that assist with files and directories
GuiCombo.au3 Functions that assist with ComboBox
GUIConstants.au3 Includes all GUI related constants
GUIConstantsEx.au3 Constants to be used in GUI applications
GUIDefaultConstants.au3 GUI default control styles
GuiEdit.au3 Functions that assist with Edit control
GuiIPAddress.au3 Used to create a GUI IP Address Control
GuiList.au3 Functions that assist with Listbox
GuiListView.au3 Functions that assist with ListView
GuiMonthCal.au3 Functions that assist with MonthCal
GuiSlider.au3 Functions that assist with Slider Control “Trackbar”
GuiStatusBar.au3 Functions that assist with the Statusbar control
GuiTab.au3 Functions that assist with the Tab Control
GuiTreeView.au3 Functions that assist with TreeView
IE.au3 Internet Explorer Automation UDF Library for AutoIt3
Inet.au3 Functions that assist with the Internet
ListBoxConstants.au3 ListBox Constants
ListViewConstants.au3 ListView Constants
Math.au3 Functions that assist with mathematical calculations
Memory.au3 Memory management routines
Misc.au3 Functions that assist with Common Dialogs
Process.au3 Functions that assist with process management
ProgressConstants.au3 Progress Constants
SliderConstants.au3 Slider Constants
Sound.au3 Functions that assist with Sound files
SQLite.au3 Functions that assist access to an SQLite database
SQLite.dll.au3 Inline SQLite3.dll
StaticConstants.au3 Static Constants
StatusBarConstants.au3 StatusBar Constants
String.au3 Functions that assist with String manipulation
TabConstants.au3 Tab Constants
TreeViewConstants.au3 TreeView Constants
UpDownConstants.au3 UpDown Constants
Visa.au3 VISA (GPIB & TCP) library
WindowsConstants.au3 Windows Constants
Windows. Còn các hàm liên quan đến chuỗi, toán học, chuyển đổi,...thì các bạn tra cứu trong file
help của AutoIt. Các chủ đề ở đây bao gồm :
Quản lý môi trường
Quản lý thư mục
Quản lý tập tin
Quản lý ổ đĩa.
1. ClipGet( )
2. ClipPut(“<value>”)
3. MemGetStats( )
4. DirCopy( “nguồn”, “đích” [, flag])
5. DirMove( “nguồn”, “đích” [,flag])
6. DirCreate( “path”)
7. DirRemove( “path” [, DelAll])
8. DirGetSize( “path” [,flag])
9. FileCopy( “nguồn”, “đích” [,flag])
10. FileMove( “file_nguồn” , “nơi đến” [, flag])
11. FileDelete( “path”)
12. FileRecycle( “nguồn”)
13. FileRecycleEmpty( [“ổ đĩa”])
14. FileGetSize( “file_name”)
15. FileExist( “path”)
16. FileInstall( “source”, “dest” [, flag])
17. FileOpenDialog ( "title", "init dir", "filter" [, options [, "def name" [, hwnd]]] )
18. FileSaveDialog ( "title", "init dir", "filter" [, options [, "def name" [, hwnd]]] )
19. FileSelectFolder ( "dialog text", "root dir" [, flag [, "initial dir" [, hwnd]]] )
20. DriveGetDrive( "type")
21. DriveGetLabel( "path")
22. DriveGetSerial( "path")
23. DriveSetLabel( "path", "label")
24. DriveSpaceFree( "path")
25. DriveSpaceTotal( "path")
26. DriveStatus( "path")
2. ClipPut(“<value>”)
Ghi một đoạn text vào clipboard
<value> : là một chuỗi muốn ghi vào clipboard
Th. Công : trả về 1
Hỏng : trả về 0
Chú ý : nội dung đã có trước đó trong clipboard sẽ bị viết đè. Một chuỗi rỗng “ “ sẽ xóa sạch
clipboard
3. MemGetStats( )
Lấy các thông tin liên quan đến bộ nhớ và trả về một mảng gồm bảy phần tử với nội dung :
$array[0] = Memory Load (Percentage of memory in use)
$array[1] = Total physical RAM
$array[2] = Available physical RAM
$array[3] = Total Pagefile
$array[4] = Available Pagefile
$array[5] = Total virtual
$array[6] = Available virtual
Đơn vị tính là Kilobyte (Kb)
3. DirCreate( “path”)
Tạo một thư mục
Path : đường dẫn đầy đủ và tên của thư mục cần tạo. Ví dụ : “c:\test\folder1”
Th. Công : trả về 1
Hỏng : trả về 0
Chú ý : hàm này sẽ tự tạo các thư mục cha (cấp trên) được chỉ định bởi path, nếu như chúng chưa
có trên đĩa
3. FileDelete( “path”)
Xóa một hoặc nhiều file được chỉ định trong “path”
Path : đường dẫn của các file cần xóa
Th. Công : trả về 1
Hỏng : trả về 0 nếu file không tồn tại hoặc không thể xóa
Chú ý : nếu muốn xóa tất cả file trong một thư mục, sử dụng mặt nạ * . * để đại diện cho tất cả
các file. Để ý rằng, một vài file có thiết lập thuộc tính sẽ không thể xóa được.
4. FileRecycle( “nguồn”)
Đưa một file hoặc thư mục vào thùng rác
Nguồn : đường dẫn và tên file hoặc thư mục cần chuyển vào thùng rác. Sử dụng * để đại diện
nhiều file.
Th. Công : trả về 1
Hỏng : trả về 0
Chú ý : để xóa một thư mục thì không sử dụng ký tự “ \” ở cuối đường dẫn chỉ định trong “nguồn”
6. FileGetSize( “file_name”)
Trả về kích thước của tập tin (tính theo byte)
File_name : đường dẫn và tên của file cần lấy
Th. Công : trả về kích thước của file (byte)
Hỏng : trả về 0 và gán @error = 1
Chú ý : lệnh này không làm việc với thư mục. Lấy kết quả chia cho 1024 để có được đơn vị tính
theo kilobyte, chia cho 1048576 để có được kích thước ở megabyte.
7. FileExist( “path”)
Kiểm tra xem file hoặc thư mục được nêu trong path có tồn tại hay không
Path : file hoặc thư mục cần kiểm tra
Th. Công : trả về 1
Hỏng : trả về 0 nếu đường dẫn chứa trong path không tồn tại
Chú ý : hàm này cũng sẽ trả về 0 nếu bạn chỉ định một ổ đĩa mềm mà lại không có chứa đĩa
10. FileSaveDialog ( "title", "init dir", "filter" [, options [, "def name" [, hwnd]]] )
Gọi hộp thoại save file (hộp thoại xuất hiện khi bạn gọi File > Save)
Title : tiêu đề của hộp thoại
Init dir : thư mục mặc định để mở khi hộp thoại vừa xuất hiện
Filter : chỉ định một hay nhiều loại tập tin cần mở
Options : [tùy chọn] 2 = đường dẫn phải tồn tại (nếu người dùng gõ đường dẫn kết thúc vơi dấu
\)
16 = nhắc nhở việc ghi đè file trùng tên
Def name : tên đề nghj cho ng dùng. Mặc định là rỗng “ “
Hwnd : handle của cửa sổ được xem như là cửa sổ mẹ của hộp thoại Save File
Th. Công : trả về đường dẫn đầy đủ và tên của tập tin được chọn. Nếu có nhiều file được chọn
thì trả về chuỗi có dạng như sau : “thư mục | file1 | file2 |. . . ”
Hỏng : gán @error = 1
Chú ý : bộ lọc phần mở rộng và kết quả trả về cho nhiều file được chọn, đều được ngăn cách mỗi
phần bởi dấu gạch đứng “|”.
11. FileSelectFolder ( "dialog text", "root dir" [, flag [, "initial dir" [, hwnd]]] )
Gọi hộp thoại Browse For Folder (hộp thoại chỉ hiện cây thư mục để chọn)
Dialog text : văn bản sẽ hiển thị trên hộp thoại, cho phép bạn nhắc nhở chức năng
Root dir : thư mục gốc của cây tập tin trong GUI. Sử dụng “ “ để chọn Desktop.
Flag : [tùy chọn] cho phép thêm một vài một lựa chọn :
1 = hiển thị nút Create Folder (đòi hỏi có IE6 trở lên)
2 = sử dụng Kiểu hộp thoại mới (New Dialog style, đòi hỏi IE6 trở lên)
4 = hiển thị một control Edit để gõ tên thư mục mới
Initial dir : Thư mục mặc định sẽ chọn khi hộp thoại xuất hiện. Sử dụng “ “ để chọn Desktop
Th. Công : trả về đường dẫn đầy đủ của thư mục được chọn
Hỏng : trả về chuỗi rỗng “ “ và gán @error = 1 nếu người dùng đóng (cancel) cửa sổ.
2. DriveGetLabel( "path")
Cho biết tên của ổ đĩa
Path : ổ đĩa cần lấy tên. Ví dụ : "C:\", "e:\"
Th. Công : trả về chuỗi là tên của ổ đĩa
Hỏng : gán @error = 1
3. DriveGetSerial( "path")
Cho biết số serial của ổ đĩa
Path : ổ đĩa cần lấy số serial
Th. Công : trả về một chuỗi là số serial
Hỏng : gán @error = 1
5. DriveSpaceFree( "path")
Lấy kích thước còn trống của ổ đĩa
Path : ổ đĩa cần lấy. ví dụ : "C:\"
Th. Công : trả về kích thước còn trống của ổ đĩa (tính theo megabyte)
Hỏng : trả về 0 và gán @error = 1
6. DriveSpaceTotal( "path")
Cho biết tổng dung lượng của ổ đĩa
Path : ổ đĩa cần lấy. ví dụ : "C:\"
Th. Công : trả về tổng dung lượng của ổ đĩa (tính theo megabyte)
Hỏng : gán @error = 1
7. DriveStatus( "path")
Trả về trạng thái của ổ đĩa
Path : ổ đĩa cần lấy trạng thái
Trả về một trong các giá trị sau :
"UNKNOWN" : ổ đĩa có thể không được định dạng
"READY" : ổ đĩa đang sẵn sàng làm việc
"NOTREADY" : ổ đĩa mềm hoặc CD không có đĩa
"INVALID" : ổ đĩa có thể không tồn tại
• Checkbox : Một ô vuông cho phép bạn đánh dấu hoặc không đánh dấu
• Radio : Một nút tròn cho phép bạn chỉ được chọn một nút trong số nhiều nút
46
7.1. GIỚI THIỆU VỀ GUI Chương 7. Giao diện đồ họa
• UpDown : Một control cho phép đính kèm cạnh bên control input
• ContextMenu : Một menu ngữ cảnh sẽ xuất hiện khi bạn nhấn chuột phải (hoặc trái, tùy vị trí)
• ListView : Control hiển thị thông tin của cột trong listview
Trước khi tìm hiểu về cách thức tạo một GUI , ở đây xin giới thiệu sơ lược với các bạn các hàm cơ
bản mà ta sẽ thường sử dụng để thao tác với một ứng dụng có cửa sổ.
• Control ID : nó thực chất là một số nguyên (>0) đại diện cho control. Thông thường ta không
biết số này là bao nhiêu (vì do hệ điều hành cung cấp khi chạy ứng dụng) và khi tạo ra một
control ta thường gán nó vào một biến, biến đó là tên đại diện, sẽ chứa ID của control đó. Do
trên cửa sổ của bạn sẽ có nhiều thành phần, mỗi thành phần cần phải có một cái tên để quản
lý và khai thác. Ví dụ bạn có hai nút bấm trên cửa sổ thì bạn phải đặt tên cho nút thứ nhất
là btn1 (hoặc btnOK) và nút thứ hai là btn2 (btnCancel) chẳng hạn. Để khi người dùng nhấp
chuột thì ta biết rằng nút bấm nào vừa được tác động.
• Control ID : là một số nguyên duy nhất, không bao giờ có sự trùng lặp (do bộ nhớ được phân
chia để chứa các thành phần ).
• Handle : cái từ này tôi không biết nên dịch thế nào cho đúng nghĩa nhưng có thể tạm hiểu rằng
, nó là một giá trị đặc biệt được tạo ra và gán vào một cửa sổ khi cửa sổ đó được tạo. Thông
thường , handle chỉ được dùng cho cửa sổ , ít khi dùng cho control. Khi nói đến handle , người
ta nghĩ ngay đến định danh của một cửa sổ (hay GUI). Và handle là một dạng dữ liệu đặc biệt
, nó không phải chuỗi hay số.
Để tạo được một ứng dụng có giao diện đồ họa , thì thành phần bạn cần tạo đầu tiên chính là một
cửa sổ. Sau khi có cửa sổ thì chúng ta sẽ tạo tiếp các thành phần con trên nó (các control).
Muốn tạo được cửa sổ ta cần gọi đến hàm GuiCreate. Có cú pháp hoàn chỉnh như sau :
GUICreate ( "title" [, width [, height [, left [, top [, style [, exStyle [, parent]]]]]]] )
Các phần được rào trong cặp dấu ngoặc vuông [ ] là tùy chọn, có thể có hoặc không. Trong đó
Style : xác định style (kiểu) cửa sổ. Xem trong GUI Control Styles Appendix của file help.
Sử dụng -1 để dùng style mặc định, bao gồm các giá trị sau : $WS_MINIMIZEBOX, $WS_CAPTION,
$WS_POPUP, $WS_SYSMENU.
Các style $WS_CLIPSIBLINGS, và $WS_SYSMENU luôn được sử dụng nếu như style $WS_MAXIMIZEBOX
hoặc $WS_SIZEBOX được chỉ định.
exStyle : xác định style mở rộng cho cửa sổ (xem bảng Extended Style Table bên dưới ). Mặc định
là -1.
Parent : handle của cửa sổ đã được tạo ra trước đó. Cửa sổ sắp tạo ra sẽ là con của cửa sổ có
handle vừa gán.
7.2.2 Trả về
Thành công : hàm trả về handle của cửa sổ
Hỏng : hàm trả về 0 và gán @error = 1
7.2.3 Chú ý
• Hai tham số Left và Top sẽ xác định vị trí xuất hiện của hộp thoại trên màn hình. Điểm giao
nhau của hai tham số này chính là góc trái trên của hộp thoại.
• Theo mặc định, các cửa sổ được tạo ra sẽ không thể có chức năng resize (dùng chuột để kéo lớn
hoặc thu nhỏ kích thước của cửa sổ) và phóng lớn cực đại (maximize). Vì thế, khi bạn muốn sử
dụng bất kỳ tính năng nào ở trên thì có thể thêm vào tham số style các giá trị WS_SIZEBOX
hoặc WS_MAXIMIZEBOX.
• Tuy nhiên, khi sử dụng WS_SIZEBOX thì các style WS_MINIMIZEBOX, WS_CAPTION,
WS_POPUP, WS_SYSMENU lại không được thiết lập. Cách tốt nhất để tạo nên một hộp
thoại có thể resize là sử dụng WS_OVERLAPPEDWINDOW.
• Khi dùng $WS_EX_MDICHILD cho tham số style mở rộng , thì vị trí cửa sổ là vị trí liên hệ
đến vùng client của cửa sổ bố-mẹ (parent). Tham số $WS_EX_LAYERED cho phép có một
bức ảnh trong suốt bên trên ảnh nền đã định nghĩa trong cửa sổ parent.
• Để kết hợp các style do bạn chỉ định với style mặc định, ta sử dụng : BitOr($GUI_SS_DEFAULT_GUI,
newstyle,...).
• Muốn sử dụng được các hằng số liên quan đến GUICreate, bạn cần gọi #include <Windows-
Constants.au3>
Tạo một cửa sổ có viền lớn gấp đôi bình thường. Tùy chọn, cửa
$WS_EX_DLGMODALFRAME sổ có thể được tạo với một thanh tiêu đề bằng cách chỉ định
WS_CAPTION trong tham số style
Tạo một cửa sổ con bên trong cửa sổ bố-mẹ (simulation not
$WS_EX_MDICHILD
real MDI).
Kết hợp style WS_EX_CLIENTEDGE
$WS_EX_OVERLAPPEDWINDOW
và WS_EX_WINDOWEDGE
Tạo một cửa sổ có viền chỉ bằng một phần ba so với bình
$WS_EX_STATICEDGE thường , style này được sử dụng cho các mục không chấp nhận
viêc nhập liệu của người dùng
GUI được tạo với style này sẽ luôn ở trên các cửa sổ khác, thậm
$WS_EX_TOPMOST
chí khi GUI không được kích hoạt.
Cửa sổ sẽ xuất hiện trong suốt bởi vì các bit của những cửa sổ
$WS_EX_TRANSPARENT
liên quan bên dưới đã được vẽ lại
Tạo ra một cửa sổ chứa công cụ, ta còn gọi là floating toolbar
(thanh công cụ trôi nổi). Cửa sổ chứa công cụ sẽ có một thanh
tiêu đề và font chữ nhỏ hơn cửa sổ bình thường. Cứa sổ này sẽ
$WS_EX_TOOLWINDOW không xuất hiện trong taskbar hoặc trong hộp thoại khi bạn
Alt-Tab. Nếu cửa sổ chứa công cụ có một menu hệ thống, icon
của nó sẽ không hiển thị trên thanh tiêu đề. Tuy nhiên, bạn có
thể ép chúng hiển thị bằng cách gõ phím Alt-Space.
$WS_EX_WINDOWEDGE Tạo cửa sổ được bao với viền nổi
Tạo một cửa sổ được xếp thành lớp (layer). Chú ý rằng cái này
$WS_EX_LAYERED
không sử dụng được cho các cửa sổ con
7.2.4 Ví dụ 1
Đoạn mã này tạo ra một cửa sổ, trên đó có chứa một label và một button. Khi bạn nhấn vào
Button sẽ tạo ra một số ngẫu nhiên và hiển thị ở label.
#include <GUIConstantsEx.au3>
$gui = GUICreate("Random number", 200, 100) ;tạo gui chính
;tạo nhãn sẽ hiển thị số vừa tạo
$label_num = GUICtrlCreateLabel("000", 20, 20, 160, 30)
;gán label này dùng font Arial, size là 14
GUICtrlSetFont(-1, 14, 400, 0, "Arial")
;tạo nút cấp phát số ngẫu nhiên
$button_gen = GUICtrlCreateButton("Generate random number", 20, 50, 160, 30)
GUISetState() ; hiển thị gui vừa tạo lên màn hình
while 1 ; vòng lặp xử lý thông điệp
$msg = GUIGetMsg() ;ghi nhận sự kiện xảy ra trên gui
Switch $msg
Case $GUI_EVENT_CLOSE ;nếu nhấn nút Close hoặc Alt-F4
ExitLoop ; thì thoát
Case $button_gen ;nếu nhấn nút cấp phát thì tạo số ngẫu nhiên
$num = Int(Random(-10^9, 10^9))
; gán vào label để hiển thị số vừa cấp phát
GUICtrlSetData($label_num, $num)
EndSwitch
WEnd
7.2.5 Ví dụ 2
Đoạn mã này minh họa việc tạo cửa sổ con có nền trong suốt bằng một ảnh gif.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Example( )
Func Example2()
Local $gui, $background, $pic, $basti_stay, $msg
Local $sFile = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", "InstallDir")
& "\Examples\GUI\logo4.gif"
$gui = GUICreate("Background", 400, 100)
; background picture
$background = GUICtrlCreatePic
(@SystemDir & "\oobe\images\mslogo.jpg", 0, 0, 400, 100)
GUISetState(@SW_SHOW)
; transparent MDI child window
$pic = GUICreate("", 169, 68, 0, 0, $WS_POPUP, BitOR
($WS_EX_LAYERED, $WS_EX_MDICHILD), $gui)
; transparent pic
$basti_stay = GUICtrlCreatePic($sFile, 0, 0, 169, 68)
GUISetState(@SW_SHOW)
Do
$msg = GUIGetMsg()
Until $msg = $GUI_EVENT_CLOSE
EndFunc
7.3.2 GUIGetCursorInfo
Lấy thông tin về vị trí của con trỏ chuột (tính theo cửa sổ GUI)
GUIGetCursorInfo ( [winhandle] )
Các tham số
winhandle [tùy chọn] handle của cửa sổ muốn sử dụng. Nếu bỏ quên thì cửa sổ hiện hành được sử
dụng
Giá trị trả về
Th. Công : Trả về một mảng có 5 phần tử , chứa các thông tin sau :
$array[0] = tọa độ X (chiều ngang)
$array[1] = tọa độ Y (chiều dọc)
$array[2] = nút thứ nhất của chuột được nhấn (thường là nút trái , 1 là có nhấn, 0 nếu không
nhấn)
$array[3] = nút thứ hai của chuột được nhấn (thường là nút phải , 1 là có nhấn, 0 nếu không nhấn)
$array[4] = ID của control mà con trỏ chuột đang bay-lượn ở trên. Cho 0 nếu không có control
Hỏng : Trả về 0 và gán @error=1
Chú ý
• Tọa độ của con trỏ chuột được tính theo tọa độ bên trong GUI , chứ không phải tính theo tọa
độ màn hình
• Nếu tham số "winhandle" được dùng thì cửa sổ được chỉ định sẽ trở thành cửa -sổ-hiện-hành
mới.
• Việc lấy thông tin về vị trí của con trỏ chuột chỉ thành công khi dùng trên một cửa sổ được
tạo ra bằng hàm GUICreate. Khi không có winhandle thì hàm chỉ thành công khi cửa sổ GUI
được kích hoạt
• Định danh của ListViewItem hoặc TreeViewItem sẽ không bao giờ được trả về , chỉ trả về ID
của ListView hoặc TreeView mà thôi.
7.3.3 GUIGetMsg
Lấy và trả về các sự kiện nào đã xảy trên GUI
GUIGetMsg ( [advanced] )
Các tham số
Advanced [tùy chọn] trả về thông tin mở rộng chứa trong một mảng
0 = (default) trả về một sự kiện đơn lẻ.
1 = trả về một mảng chứa sự kiện và thông tin mở rộng
Giá trị trả về
Trả về một giá trị đơn hoặc một mảng tùy vào tham số Advanced
Sự kiện sẽ trả về định danh (ID) của control đã gởi đi thông điệp , hoặc nó là một sự kiện đặc biệt
(như là đóng hoặc thu nhỏ cửa sổ ,...). Hoặc trả về 0 nếu không có sự kiện nào xảy ra.
Khi sử dụng tham số Advanced thì thông tin mở rộng được trả về trong mảng như sau :
$array[0] = 0 hoặc ID của sự kiện hoặc ID của control
$array[1] = Handle của cửa sổ đã phát ra sự kiện
• Hàm này sẽ tự động tạo ra khoảng dừng để không làm quá tải cho CPU nên nó có thể sử dụng
một cách an toàn trong vòng lặp khép kín mà không cần bất kỳ lệnh sleep hay delay khác
• Thông tin về vị trí của con trỏ chuột và control đang được con trỏ "bay lượn" phía trên có thể
được truy lại bằng hàm GUIGetCursorInfo. Không có sự kiện nào xảy ra khi con trỏ chuột vượt
qua control vì thế GUIGetCursorInfo phải được gọi để lấy ID của control đó.
7.3.4 GUIGetStyle
Truy lại các style của GUI
GUIGetStyle ( [ winhandle] )
Các tham số
winhandle [tùy chọn] handle của cửa sổ , được trả về từ hàm GUICreate... (mặc định là GUI trước
đó)
Giá trị trả về
Th. Công : Trả về một mảng gồm hai phần tử chứa thông tin của style
$array[0] = Style
$array[1] = style mở rộng
Hỏng : Trả về 0
Chú ý: Cẩn thận về những thay đổi của style sau khi hàm GUISetState được gọi.
7.3.5 GUIRegisterMsg
Đăng ký một hàm-do-người-dùng-định-nghĩa cho Windows Message ID (WM_MSG) .
GUIRegisterMsg ( msgID, "function" )
Các tham số
msgID : Định danh thông điệp windows (Windows Message ID , Xem Appendix: Windows Message
Codes).
function : Tên của hàm sẽ được gọi khi thông điệp xuất hiện , sử dụng chuỗi rỗng để bỏ qua , không
đăng ký.
Giá trị trả về
Th. Công : 1
Hỏng : 0
Chú ý
!!! Để hàm do bạn định nghĩa có thể làm việc được , cần gán cho nó tối đa 4 tham số , ngược lại
có thể nó sẽ không được gọi !!! Ví dụ:
Func MyUserFunction($hWndGUI, $MsgID, $WParam, $LParam)
...
EndFunc
hoặc
Func MyUserFunction($hWndGUI, $MsgID)
...
EndFunc
Khi người dùng gọi hàm thì 4 tham số sẽ mang những giá trị sau :
• Có thể đăng ký tối đa 256 hàm cho các thông điệp windows
• Theo mặc định , sau khi hàm người dùng kết thúc thì trình điều khiển thông điệp nội bộ của
AutoIT sẽ tiếp tục làm việc. Điều đó sẽ không xảy ra nếu như lệnh Return trong hàm của bạn
trả về một giá trị hoặc return mà không có giá trị theo sau.
• !!! Nếu bạn muốn AutoIT chạy trình điều khiển nội bộ đối với một thông điệp , thì hàm-người-
dùng nên trả về biến $GUI_RUNDEFMSG (trong thư viện GUIConstantsEx.au3) !!!
• Ví dụ : khi bạn muốn hàm trở về sớm hơn so với tiến trình kết thúc của nó và tiếp tục chạy
trình điều khiển thông điệp nội bộ
• Cẩn trọng : cản trở việc chạy một hàm-người-dùng đang thực thi một thông điệp cửa sổ với
một lệnh như MsgBox() thì có thể đưa đến một cách chạy không mong đợi, hệ thống sẽ trở về
nhanh như có thể !!!
• Vài control có sử dụng các định danh thông điệp Windows đặc biệt , cho nên việc đăng ký chúng
không có hiệu quả. Ví dụ như : WM_CHAR, WM_KEYDOWN, WM_KEYUP được dùng bởi
control edit.
7.3.6 GUISetAccelerators
Cài đặt một bảng tăng tốc cho GUI . Bảng tăng tốc này sẽ cho phép người dùng sử dụng các phím
nóng
GUISetAccelerators ( accelerators [, winhandle] )
Các tham số
Accelerators: Một mảng hai chiều để tổ chức bảng tăng tốc (xem chú ý)
winhandle: [tùy chọn] handle của cửa sổ cần cài đặt , được trả về từ hàm GUICreate (mặc định là
gui trước đó).
Giá trị trả về
Th. Công : Returns 1.
Hỏng : Returns 0.
Chú ý
Mảng này có chức năng là chứa phím nóng (hotkey) và ID của control cần gọi . Mảng phải được
định nghĩa như sau :
Dim $array[n][2] – trong đó n là tổng số phím tăng tốc cần thiết lập
$array[0][0] = Hotkey (theo định dạng của hàm HotKeySet) đầu tiên
$array[0][1] = Control ID sẽ dùng cho hotkey đầu tiên, được trả về từ hàm GUICtrlCreate...
$array[1][0] = Hotkey thứ hai
$array[1][1] = Control ID sẽ dùng cho hotkey thứ hai... .........
$array[n][0] = Hotkey thứ n
$array[n][1] = Control ID sẽ dùng cho hotkey thứ n
Nếu tham số truyền không phải là mảng hai chiều thì sẽ không có trình tăng tốc nào được tạo.
7.3.7 GUISetBkColor
Thiết lập màu nền cho cửa sổ
GUISetBkColor ( background [, winhandle] )
Các tham số
Background: Màu nền cần gán
winhandle: [tùy chọn] handle của cửa sổ mà bạn muốn gán màu (mặc định là cửa sổ trước đó)
Giá trị trả về
Th. Công : Returns 1.
Hỏng : Returns 0.
Chú ý
Những phiên bản trước của AutoIt (v3.0.102) sử dụng định dạng màu BGR , những phiên bản mới
hơn sử dụng RGB theo mặc định. Tuy nhiên bạn có thể thay đổi điều này bằng lựa chọn ColorMode.
7.3.8 GUISetFont
Thiết lập font chữ mặc định cho GUI
GUISetFont (size [, weight [, attribute [, fontname [, winhandle]]]] )
Các tham số
Size: Kích cỡ của font (mặc định là 8.5)
weight: [tùy chọn] trọng lượng của font (bình thường = 400)
attribute: [tùy chọn] muốn thiết lập định dạng cho ký tự , ta có in nghiêng : 2 , gạch chân : 4 ,
gạch ngang (strike) : 8 . Muốn kết hợp nhiều định dạng ta cộng các giá trị với nhau. Ví dụ , muốn
có chữ in nghiêng và gạch chân , ta dùng 2+4.
fontname: [tùy chọn] tên của font chữ sẽ dùng
winhandle: [tùy chọn] handle của cửa sổ , được trả về từ hàm GUICreate (mặc định là cửa sổ đã
dùng trước đó)
Giá trị trả về
Th. Công : Returns 1.
Hỏng : Returns 0.
Chú ý:
• Vài control như Label , mặc định giá trị 8.5 có thể được thay bằng 9 theo ghi nhận từ Windows
Theme
• Xem Appendix để có được một danh sách đầy đủ về các font của windows
7.3.9 GUISetHelp
Cài đặt một file thi hành để gọi khi phím F1 được nhấn
GUISetHelp ( helpfile [, winhandle] )
Các tham số
Helpfile: File sẽ chạy khi mà phím F1 được nhấn (lúc gui đã được kích hoạt)
Winhandle: [tùy chọn] handle của cửa sổ , được trả về từ hàm GuiCreate(mặc định là Gui trước
đó)
Giá trị trả về
Th. Công : Returns 1.
Hỏng : Returns 0.
7.3.10 GUISetOnEvent
Thiết lập một hàm cần gọi khi có một nút được nhấn (hàm đó do người viết mã soạn)
GUISetOnEvent ( specialID, "function" [, winhandle] )
Các tham số
specialID: Xem bảng ID bên dưới
function: Tên của hàm cần gọi (hàm này do người viết script soạn)
winhandle: [tùy chọn] handle của cửa sổ cần thiết lập , được trả về từ hàm GUICreate (mặc định
là gui trước đó)
Special Id Miêu tả
Hộp thoại bị đóng (click nút close hoặc menu hệ thống hoặc
$GUI_EVENT_CLOSE
một nút do ta tạo)
Hộp thoại bị thu nhỏ (minimize) bởi click nút bấm từ thanh
$GUI_EVENT_MINIMIZE
tiêu đề
$GUI_EVENT_RESTORE Hộp thoại được phục hồi do nhấn nút ở thanh taskbar
$GUI_EVENT_MAXIMIZE Hộp thoại được phóng lớn cực đại do nhấn nút maximize
$GUI_EVENT_MOUSEMOVE Con trỏ chuột được di chuyển
Nút cơ bản của chuột được nhấn giữ (thường là nút trái , nó
$GUI_EVENT_PRIMARYDOWN
tùy vào thiết lập trong win)
$GUI_EVENT_PRIMARYUP Nút cơ bản của chuột được nhả ra
$GUI_EVENT_SECONDARYDOWNNút thứ hai của chuột được nhấn giữ (thường là nút phải)
$GUI_EVENT_SECONDARYUP Nút thức hai của chuột được nhả ra
$GUI_EVENT_RESIZED Cửa sổ được định lại kích thước (resize)
Kết thúc của hành động kéo & thả @GUI_DRAGID,
$GUI_EVENT_DROPPED @GUI_DRAGFILE và @GUI_DROPID sẽ được sử dụng để
truy lại ID hoặc tập tin cho các control liên quan.
• Các hàm OnEvent chỉ được gọi khi lựa chọn chế độ xử lý gui là GUIOnEventMode (chế độ
vòng lặp thông điệp sẽ không làm việc khi có lựa chọn Opt("GuiOnEventMode", 1) ) . Đồng
thời các nút minimize, maximize và restore sẽ không đưa ra bất cứ phản ứng nào.
• Nếu function là một chuỗi rỗng "" , thì không có phản ứng xảy ra khi người dùng thao tác.
7.3.11 GUISetState
Thay đổi trạng thái của cửa sổ GUI
GUISetState ( [flag [, winhandle]] )
Các tham số
[tùy chọn]
@SW_SHOW = hiển thị cửa sổ đã ẩn trước đó (default)
@SW_HIDE = Ẩn cửa sổ
@SW_MINIMIZE = Minimize (cực tiểu) cửa sổ
flag @SW_MAXIMIZE = Maximize (cực đại) cửa sổ
@SW_RESTORE = phục hồi lại cửa sổ đã bị cực tiểu
@SW_DISABLE = Vô hiệu cửa sổ
@SW_ENABLE = kích hoạt cửa sổ
@SW_LOCK = Khóa cửa sổ không cho vẽ lại
@SW_UNLOCK = Mở khóa cửa sổ , cho phép vẽ lại
[tùy chọn] handle của gui cần thiết lập trạng thái , trả về từ hàm
winhandle
GUICreate (mặc định là GUI trước đó)
• Khi cửa sổ được tạo ra , chúng sẽ bị ẩn . Cho nên muốn hiển thị cửa sổ ta phải gọi hàm này
với tham số @SW_SHOW
• Chỉ một cửa sổ là có thể bị khóa với @SW_LOCK. Các @SW_LOCK khác sẽ khóa cửa sổ khi
có yêu cầu. @SW_UNLOCK bỏ qua "winhandle" để mở khóa bất kỳ cửa sổ nào bị khóa..
7.3.12 GUISetStyle
Thay đổi style cho cửa sổ
GUISetStyle ( Style [,ExStyle [, winhandle]] )
Các tham số
Định nghĩa style cho cửa sổ. Xem GUI Control Styles Appendix.
Style
sử dụng -1 để bỏ qua , không thay đổi
[tùy chọn] định nghĩa style mở rộng cho gui. Xem bảng Extended Style Table
exStyle bên dưới. -1 là mặc định
, không thay đổi style
[tùy chọn] handle của cửa sổ cần thiết lập , được trả về từ hàm GUICreate
winhandle
(mặc định là Gui trước đó)
• Để kết hợp style mặc định với các style khác, gọi BitOr($GUI_SS_DEFAULT_LABEL, new-
style,...
• Muốn dùng các giá trị nêu trên, phải gọi #include <StaticConstants.au3> trong file script của
bạn
• Style mở rộng $GUI_WS_EX_PARENTDRAG cho phép bạn kéo những cửa sổ bố-mẹ không
có thanh tiêu đề (không có $WS_CAPTION trong GUICreate)
$msg = GUIGetMsg()
Until $msg = $GUI_EVENT_CLOSE
$iOldOpt = Opt("GUICoordMode", $iOldOpt)
EndFunc ;==>Example
7.4.2 GUICtrlCreatePic
Hàm này sẽ tạo ra một control cho phép nạp và hiển thị hình ảnh (picture) trên GUI.
GUICtrlCreatePic ( filename, left, top [, width [, height [, style [, exStyle]]]] )
Các tham số
Đường dẫn và tên đầy đủ file ảnh cần load. Hỗ trợ ảnh BMP, JPG và GIF
Filename
(không có hình động)
Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề trái
left
được tính theo GUICoordMode.
Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề trái
Top
được tính theo GUICoordMode.
width [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó
height [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước đó.
[Tùy chọn] Định nghĩa style cho control. Xem GUI Control Styles Appendix.
Style default (-1) : $SS_NOTIFY
style bắt buộc : $SS_BITMAP
exStyle [tùy chọn] Định nghĩa style mở rộng. Xem Extended Style Table.
• Để thiết lập hoặc thay đổi thông tin picture, xem hàm GUICtrlSet....
• Để cập nhật ảnh sau khi hộp thoại đã được hiển thị , sử dụng hàm GUICtrlSetImage
• Nếu bạn muốn ảnh hiển thị với kích thước gốc của nó , gán width = heigh = 0
• Nếu bạn muốn có một ảnh trong suốt , bạn cần tạo GUI với style mở rộng $WS_LAYERED.
Điểm ảnh left-top (góc trái trên) sẽ được dùng làm màu trong suốt. Khi có nhiều ảnh được tạo
, thì ảnh cuối cùng được định nghĩa màu trong suốt. Xem example 2.
• .Để kết hợp style mặc định với style khác , sử dụng BitOr($GUI_SS_DEFAULT_PIC, new-
style,...).
• Để sử dụng được các giá trị nêu trên , gọi thư viện #include <StaticConstants.au3>
• Nếu một ảnh được thiết lập làm ảnh trong suốt , các control khác sẽ bị phủ lấp , điều quan trọng
là phải vô hiệu control pic và tạo nó sau khi bạn đã tạo các control khác : GUICtrlSetState(-1,
$GUI_DISABLE). Chỉ điều này thôi thì chưa đủ cho control Tab và ListView vì chúng sẽ hoạt
động hơi khác thường. Trong trường hợp này bạn cần tạo ảnh với style $WS_CLIPSIBLINGS
, GuiCtrlSetState(-1,$GUI_ONTOP) là cần thiết cho control Tab và ListView.
• Style mở rộng $GUI_WS_EX_PARENTDRAG cho phép bạn nắm và kéo những cửa sổ con
không có thanh tiêu đề.
• Nền thì luôn được làm cho trong suốt. GUICtrlSetBkColor( ) thì không có tác dụng đối với
control picture.
Ví dụ
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt(’MustDeclareVars’, 1)
Global $gui, $guiPos, $pic, $picPos
Example1()
Example2()
;----- example 1 ----
Func Example1()
Local $n, $msg
GUICreate("My GUI picture", 350, 300, -1, -1, $WS_SIZEBOX + $WS_SYSMENU)
; will create a dialog box that when displayed is centered
GUISetBkColor(0xE0FFFF)
$n = GUICtrlCreatePic(@SystemDir & "\oobe\images\mslogo.jpg", 50, 50, 200, 50)
GUISetState()
; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
;~ GUISetState ()
; resize the control
$n = GUICtrlSetPos($n, 50, 50, 200, 100)
; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
GUIDelete()
EndFunc ;==>Example1
7.4.3 GUICtrlCreateInput
Input chính là một textbox cho phép người dùng nhập văn bản vào . Văn bản đó có thể được phân
loại, kiểm tra xem có phù hợp với định dạng hay không. Định dạng đó có thể là , chỉ cho phép nhập
số không được nhập ký tự chẳng hạn. Hình thức input mà bạn thường gặp nhất là ở các hộp thoại
đăng nhập, yêu cầu user và password.
GUICtrlCreateInput ( "text", left, top [, width [, height [, style [, exStyle]]]] )
Các tham số
[tùy chọn] Định nghĩa style cho input. Xem GUI Control Styles Appendix.
default ( -1) : $ES_LEFT, $ES_AUTOHSCROLL
style
style bắt buộc : $WS_TABSTOP only if no $ES_READONLY.
$ES_MULTILINE is always reset.
exStyle [tùy chọn] định nghĩa style mở rộng. Xem Extended Style Table.
• Để đọc nội dung của input, xem hàm GUICtrlRead. Để gán thông tin cho input , xem hàm
GUICtrlSet....
• Dùng input như một hộp nhập password thì dùng style $ES_PASSWORD (mỗi ký tự nhập vào
sẽ được thay bằng dấu * )
• Nếu bạn muốn kéo thả một filename vào input, sử dụng style mở rộng WS_EX_ACCEPTFILES
trong hàm tạo cửa sổ GUICreate() và thiết lập trạng thái $GUI_DROPACCEPTED.
• Nếu có nhiều tập tin được kéo thả vào control, tên của các tập tin được ngăn cách với nhau
bằng dấu gạch đứng " | ". Dùng GuiCtrlRead để lấy văn bản này.
• Thư viện chứa các giá trị nêu trên #include <EditConstants.au3>
Ví dụ
#include <GUIConstantsEx.au3>
Opt(’MustDeclareVars’, 1)
Example()
Func Example()
Local $file, $btn, $msg
GUICreate(" My GUI input acceptfile", 320, 120, @DesktopWidth / 2 - 160,
@DesktopHeight / 2 - 45, -1, 0x00000018); WS_EX_ACCEPTFILES
$file = GUICtrlCreateInput("", 10, 5, 300, 20)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlCreateInput("", 10, 35, 300, 20);will not accept drag&drop files
$btn = GUICtrlCreateButton("Ok", 40, 75, 60, 20)
GUISetState()
$msg = 0
While $msg <> $GUI_EVENT_CLOSE
$msg = GUIGetMsg()
Select
Case $msg = $btn
ExitLoop
EndSelect
WEnd
MsgBox(4096, "drag drop file", GUICtrlRead($file))
EndFunc ;==>Example
7.4.4 GUICtrlCreateEdit
Edit chính là hộp soạn thảo văn bản tương tự như input. Nhưng input thì chỉ có một dòng, còn
edit thì có nhiều dòng và kích thước lớn. Vùng soạn thảo văn bản của notepad chính là một Edit.
Muốn tạo một Edit , bạn chỉ cần gọi và thiết lập đúng hàm sau :
GUICtrlCreateEdit ( "text", left, top [, width [, height [, style [, exStyle]]]] )
Các tham số
• Nếu bạn muốn kéo thả một filename vào edit, sử dụng style mở rộng WS_EX_ACCEPTFILES
trong hàm tạo cửa sổ GUICreate() và thiết lập trạng thái $GUI_DROPACCEPTED.
• Nếu có nhiều file được chọn để kéo thả vào Edit thì tên của mỗi file được ghi trên một dòng
riêng biệt
• Thư viện chứa các giá trị được nêu ở trên #include <EditConstants.au3>
• Việc tạo một RichEdit thì quá phức tạp vì thế không đề cập ở đây. Nó phải sử dụng đến
GuiCtrlCreateObj. Bạn muốn tìm hiểu thì xem ở ví dụ 2 trong file help của AutoIt.
Ví dụ
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
Opt(’MustDeclareVars’, 1)
Example()
Func Example()
Local $myedit, $msg
GUICreate("My GUI edit")
; will create a dialog box that when displayed is centered
7.4.5 GUICtrlCreateCheckbox
Nói đến checkbox có lẽ bạn đã quá quen thuộc , dạng nút này thường hay xuất hiện trong các hộp
thoại option. Cái nút hình vuông mà mỗi lần bạn nhấp vào nó sẽ bị mất hoặc bị đánh dấu chữ " v
" . Nếu được đánh dấu thì nó có hiệu lực , ngược lại thì không. Thông thường nó thích hợp cho việc
hỏi ý người dùng về việc lựa chọn nào đó (lựa chọn là chỉ có hoặc không).
GUICtrlCreateCheckbox ( "text", left, top [, width [, height [, style [, exStyle]]]] )
Các tham biến
text Văn bản hiển thị cạnh bên checkbox để miêu tả nội dung (không phải tooltip)
Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề trái
left
được tính theo GUICoordMode.
Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề trái
Top
được tính theo GUICoordMode.
width [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó
height [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước đó.
[Tùy chọn] Định nghĩa style cho control. Xem GUI Control Styles Appendix.
default ( -1) : $BS_AUTOCHECKBOX.
style
forced styles : $WS_TABSTOP, and $BS_AUTOCHECKBOX if no check-
box style defined.
exStyle [tùy chọn] Định nghĩa style mở rộng. Xem Extended Style Table.
#include <GUIConstantsEx.au3>
Opt(’MustDeclareVars’, 1)
Example()
Func Example()
Local $checkCN, $msg
GUICreate("My GUI Checkbox")
; will create a dialog box that when displayed is centered
$checkCN = GUICtrlCreateCheckbox("CHECKBOX 1", 10, 10, 120, 20)
GUISetState() ; will display an dialog box with 1 checkbox
; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
EndFunc ;==>Example
7.4.6 GUICtrlCreateRadio
Radio là một dạng nút-lựa-chọn gần giống như checkbox , nhưng khác với checkbox ở hai điểm.
Thứ nhất là các radio thường tập hợp thành một nhóm với nhau. Thứ hai là trong nhóm đó bạn chỉ
được phép chọn một (giống như trắc nghiệm vậy). Hàm sau cho phép bạn tạo mỗi lần một nút radio.
GUICtrlCreateRadio ( "text", left, top [, width [, height [, style [, exStyle]]]] )
Các tham số
Text Văn bản hiện thị cạnh bên miêu tả nội dung của radio (không phải tooltip)
Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề trái
left
được tính theo GUICoordMode.
Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề trái
Top
được tính theo GUICoordMode.
width [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó
height [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước đó.
[Tùy chọn] Định nghĩa style cho control. Xem GUI Control Styles Appendix.
default ( -1) : none.
style
style bắt buộc : $BS_AUTORADIOBUTTON và $WS_TABSTOP nếu là
nút radio đầu tiên trong nhóm.
exStyle [tùy chọn] Định nghĩa style mở rộng. Xem Extended Style Table.
#include <GUIConstantsEx.au3>
Opt(’MustDeclareVars’, 1)
Example()
Func Example()
Local $radio1, $radio2, $msg
7.4.7 GUICtrlCreateList
Hàm này sẽ giúp bạn tạo ra một cái danh sách để chứa thông tin. Danh sách là một dạng dữ liệu
rất hay gặp trong đời thường và trên máy tính (ở các chương trình nghe nhạc và quản lý). Tuy nhiên,
ở đây AutoIt chỉ hỗ trợ bạn tạo ra một danh sách với các tính năng đơn giản, thông dụng. Danh sách
này chỉ có một cột nhưng lại có nhiều dòng. Nếu bạn cần một danh sách có nhiều cột và nhiều dòng
thì hãy dùng ListView , ở đây tôi không đề cập đến phần này. Cú pháp cho bạn tạo một Listbox như
sau :
GUICtrlCreateList ( "text", left, top [, width [, height [, style [, exStyle]]]] )
Các tham số
• Để thiết lập hoặc thay đổi thông tin , xem hàm GUICtrlSet....
• Nhiều mục-nhập (entry) khác nhau trong danh sách có thể được chọn , được thiết lập với
GUICtrlSetData
• Để giới hạn mức cuộn (srolling) theo chiều ngang , dùng hàm GUICtrlSetLimit
• Để kết hợp style mặc định với các style khác , gọi BitOr($GUI_SS_DEFAULT_LIST, new-
style,...).
• Để sử dụng được các giá trị nêu trên , cần gọi thư viện : #include <ListBoxConstants.au3>
Ví dụ
#include <GUIConstantsEx.au3>
Opt(’MustDeclareVars’, 1)
Example()
Func Example()
Local $MESSAGE = "The following buttons have been clicked"
Local $add, $clear, $mylist, $close, $msg
GUICreate("My GUI list")
; will create a dialog box that when displayed is centered
$add = GUICtrlCreateButton("Add", 64, 32, 75, 25)
$clear = GUICtrlCreateButton("Clear", 64, 72, 75, 25)
$mylist = GUICtrlCreateList("buttons that have been clicked", 176, 32, 121, 97)
GUICtrlSetLimit(-1, 200) ; to limit horizontal scrolling
GUICtrlSetData(-1, $MESSAGE)
$close = GUICtrlCreateButton("my closing button", 64, 160, 175, 25)
GUISetState()
$msg = 0
While $msg <> $GUI_EVENT_CLOSE
$msg = GUIGetMsg()
Select
Case $msg = $add
GUICtrlSetData($mylist, "You clicked button No1|")
Case $msg = $clear
GUICtrlSetData($mylist, "")
Case $msg = $close
MsgBox(0, "", "the closing button has been clicked", 2)
Exit
EndSelect
WEnd
EndFunc ;==>Example
7.4.8 GUICtrlCreateListView
ListView cũng chính là một danh sách (Listbox) nhưng nó có nhiều dòng và nhiều cột , tạo thành
một ma trận. Listview mà bạn thường thấy là trong Windows Explorer , khi bạn duyệt file với chế
độ View là Detail.
GUICtrlCreateListView ( "text", left, top [, width [, height [, style [, exStyle]]]] )
Các tham số
Văn bản này sẽ là tiêu đề của các cột trong listview. Mỗi tiêu đề sẽ được
text
ngăn cách với ký tự được chỉ định trong Opt("GUIDataSeparatorChar").
Khoảng cách canh từ lề trái của GUI (tọa độ x). Nếu sử dụng -1, thì lề trái
left
được tính theo GUICoordMode.
Khoảng cách canh từ lề trên của GUI (tọa độ y). Nếu sử dụng -1, thì lề trái
Top
được tính theo GUICoordMode.
width [tùy chọn] độ rộng của control. Mặc định là độ rộng đã dùng trước đó
height [tùy chọn] chiều cao của control. Mặc định là chiều cao đã dùng trước đó.
[tùy chọn] định nghĩa style cho control. Xem GUI Control Styles Appendix.
style default (-1) : $LVS_SHOWSELALWAYS, $LVS_SINGLESEL
style bắt buộc : $LVS_REPORT
[tùy chọn] định nghĩa style mở rộng cho control. Xem Extended Style Table
exStyle
hoặc ListView Extended Style Table.
• ListView sẽ xuất hiện mặc định như trong windows explorer với view là Detail (LVS_REPORT
là bắt buộc). Bạn có thể khởi tạo kích thước cho một cột bằng cách nối thêm các khoảng trắng
vào tiêu đề của cột. Cột có thể được mở rộng theo chiều dài của mục-(item)-được-thêm-vào bởi
GUICtrlCreateListViewItem. Kích thước của một cột sẽ lên đến 25 ký tự. Nhưng sẽ không có
một sự resize được diễn ra khi bạn cập nhật nội dung ListView bằng GuiCtrlSetData.
• Để tạo một ListView với icon, icon nhỏ hoặc chỉ là một kiểu List , sau khi tạo bạn gọi hàm
GUICtrlSetStyle với các style : $LVS_ICON, $LVS_SMALLICON hoặc $LVS_LIST.
• Chức năng sắp xếp các mục trong ListView bằng cách nhấp vào tiêu đề của cột (như trong
Explorer) thì không có tác dụng.
• Khi bạn chọn một mục trong ListView, bạn muốn toàn bộ dòng đó được phát sáng thay vì chỉ
có ở một cột thì hãy gọi style mở rộng $LVS_EX_FULLROWSELECT.
• Để kết hợp style mặc định với style khác , bạn gọi BitOr($GUI_SS_DEFAULT_LISTVIEW,
newstyle,...).
• Thư viện cần thiết cho các tham số nêu ở trên là : #include <ListViewConstants.au3>
• $GUI_BKCOLOR_LV_ALTERNATE là một cờ đặc biệt , có thể dùng với Listview để làm cho
màu nền giữa các dòng có thể xen kẽ nhau.
– Dòng chẵn sẽ lấy màu được thiết lập bởi hàm GUICtrlSetBkColor của control ListView
– Dòng lẻ sẽ lấy màu được thiết lập bởi hàm GUICtrlSetBkColor của control ListViewItem
Ví dụ
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt(’MustDeclareVars’, 1)
Example()
Func Example()
Local $listview, $button, $item1, $item2, $item3, $input1, $msg
GUICreate("listview items", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
GUISetBkColor(0x00E0FFFF) ; will change background color
$listview = GUICtrlCreateListView("col1 |col2|col3 ", 10, 10, 200, 150)
;,$LVS_SORTDESCENDING)
$button = GUICtrlCreateButton("Value?", 75, 170, 70, 20)
$item1 = GUICtrlCreateListViewItem("item2|col22|col23", $listview)
$item2 = GUICtrlCreateListViewItem("item1|col12|col13", $listview)
$item3 = GUICtrlCreateListViewItem("item3|col32|col33", $listview)
$input1 = GUICtrlCreateInput("", 20, 200, 150)
GUICtrlSetState(-1, $GUI_DROPACCEPTED) ; to allow drag and dropping
GUISetState()
GUICtrlSetData($item2, "ITEM1")
GUICtrlSetData($item3, "||COL33")
GUICtrlDelete($item1)
Do
$msg = GUIGetMsg()
Select
Case $msg = $button
MsgBox(0, "listview item", GUICtrlRead(GUICtrlRead($listview)), 2)
Case $msg = $listview
MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
EndSelect
Until $msg = $GUI_EVENT_CLOSE
EndFunc ;==>Example
7.4.9 GUICtrlCreateListViewItem
Tạo ra một mục (item) mới để thêm vào trong ListView.
GUICtrlCreateListViewItem ( "text", listviewID )
Các tham số
Text: Văn bản của các mục (item) phụ, mỗi mục được ngăn cách với Opt("GUIDataSeparatorChar").
listviewID: Định danh (ID) của control ListView mà bạn muốn thêm item vào
Giá trị trả về
Th. Công : Định danh (ID) của mục vừa được tạo
Failure: Trả về 0
Chú ý
• Hàm này tạo ra những mục (item) Listview đặc biệt, chúng có thể được chọn, có tính năng như
những control bình thường và có thể được thiết lập với GUICtrlSetData.
• Các item này có thể được xóa bỏ như các control khác khi gọi hàm GUICtrlDelete
• Những mục trong Listview có thể được kéo thả vào trong một control Edit hay Input , khi được
thiết lập trạng thái (state) $GUI_DROPACCEPTED.
• Xem hàm GUICtrlCreateListView về việc resize lại kích thước của các cột.
• $GUI_BKCOLOR_LV_ALTERNATE là một cờ đặc biệt , có thể dùng với Listview để làm cho
màu nền giữa các dòng có thể xen kẽ nhau.
– Dòng chẵn sẽ lấy màu được thiết lập bởi hàm GUICtrlSetBkColor của control ListView
– Dòng lẻ sẽ lấy màu được thiết lập bởi hàm GUICtrlSetBkColor của control ListViewItem
Ví dụ
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt(’MustDeclareVars’, 1)
Example()
Func Example()
Local $listview, $button, $item1, $item2, $item3, $input1, $msg
GUICreate("listview items", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
GUISetBkColor(0x00E0FFFF) ; will change background color
$listview = GUICtrlCreateListView("col1 |col2|col3 ", 10, 10, 200, 150)
;,$LVS_SORTDESCENDING)
$button = GUICtrlCreateButton("Value?", 75, 170, 70, 20)
$item1 = GUICtrlCreateListViewItem("item2|col22|col23", $listview)
$item2 = GUICtrlCreateListViewItem("............item1|col12|col13"
, $listview)
$item3 = GUICtrlCreateListViewItem("item3|col32|col33", $listview)
$input1 = GUICtrlCreateInput("", 20, 200, 150)
GUICtrlSetState(-1, $GUI_DROPACCEPTED); to allow drag and dropping
GUISetState()
GUICtrlSetData($item2, "|ITEM1")
GUICtrlSetData($item3, "||COL33")
GUICtrlDelete($item1)
Do
$msg = GUIGetMsg()
Select
Case $msg = $button
MsgBox(0, "listview item", GUICtrlRead(GUICtrlRead($listview)), 2)
Case $msg = $listview
MsgBox(0, "listview", "clicked=" & GUICtrlGetState($listview), 2)
EndSelect
Until $msg = $GUI_EVENT_CLOSE
EndFunc ;==>Example
7.5.2 GUICtrlGetState
Lấy trạng thái hiện hành của control
GUICtrlGetState ( [controlID] )
Các tham số
controlID: [tùy chọn] định danh của control được trả về từ hàm GUICtrlCreate....
Giá trị trả về
Th. Công : Trả về trạng thái. Xem hàm GUICtrlSetState để biết giá trị
Hỏng : Trả về -1 nếu control không được định nghĩa
Chú ý
Khác với hàm GUICtrlRead , hàm này chỉ trả về trạng thái của control : kích hoạt/vô hiệu/ẩn/hiện/cho
phép kéo thả Ngoại lệ : với ListView nó trả về tổng số cột đã click
7.5.3 GUICtrlRead
Đọc trạng thái hoặc dữ liệu của control
GUICtrlRead ( controlID [, advanced] )
Các tham số
controlID: Định danh của control , được trả về từ hàm GUICtrlCreate...
advanced: [tùy chọn] trả về thông tin mở rộng của control
0 = (Default) trả về một giá trị là trạng thái hoặc dữ liệu của control
1 = trả về thông tin mở rộng (xem chú ý)
Giá trị trả về
Th. Công : Trả về giá trị phụ thuộc vào loại control
Hỏng : Trả về 0
Chú ý
Trong chế độ advanced , giá trị trả về chứa dữ liệu bổ sung của control (xem bảng bên dưới) ghi
chú : không phải tất cả các control đều có sẵn thông tin bổ sung !
• Với checkbox , radio vài trạng thái có thể trả về $GUI_FOCUS và $GUI_CHECKED,. Ví dụ
: BitAnd(GUICtrlRead($Item),$GUI_CHECKED) để kiểm tra xem control có được đánh-dấu-
chọn (check).
• Đối với các mục trong Listview , vài trạng thái có thể được trả về như $GUI_CHECKED và
$GUI_UNCHECKED (chỉ đối với control listview có style mở rộng LVS_EX_CHECKBOXES
– trả về dạng Advanced) . ví dụ : BitAnd(GUICtrlRead($Item),$GUI_CHECKED) để kiểm tra
xem item có được đánh dấu hay không.
• Đối với các mục trong TreeView , vài trạng thái có thể được trả về như $GUI_FOCUS,
$GUI_EXPAND và $GUI_CHECKED, $GUI_UNCHECKED (chỉ đối với treeview controls có
style TVS_CHECKBOXES). Ví dụ : BitAnd(GUICtrlRead($Item),$GUI_CHECKED) để kiểm
tra xem control có được check
7.5.4 GUICtrlRegisterListViewSort
Đăng ký một hàm đã được định nghĩa dùng vào việc sắp xếp các mục trong ListView. Đây là hàm
nội bộ , sẽ được gọi tự động khi có yêu cầu sắp xếp.
GUICtrlRegisterListViewSort ( controlID, "function" )
Các tham số
controlID: ID của ListView
function: Tên của hàm cần gọi để thực hiện sắp xếp
Giá trị trả về
Th. Công : 1
Hỏng : 0
Chú ý :
!!! Để hàm có thể làm việc , bạn phải định nghĩa nó với tối đa 4 tham số , ngược lại thì hàm sẽ
không được gọi !!!
Ví dụ :
Khi hàm được gọi thì 4 tham số trên sẽ mang các giá trị sau :
Những giá trị sau sẽ được trả về để thay đổi cách chạy của hàm:
0 Không đổi
1 Mục thứ nhất đặt sau mục thứ hai.
7.5.5 GUICtrlSetBkColor
Thay đổi màu nền hiện tại của control sang một màu khác
GUICtrlSetBkColor ( controlID, backgroundcolor )
Các tham số
controlID: ID của control muốn đổi màu nền. ID này được trả về bởi hàm GUICtrlCreate. . . .
backgroundcolor: Màu RGB muốn sử dụng
Giá trị trả về
Th. Công : Trả về 1
Hỏng : Trả về 0
Chú ý
• Chỉ có Button, Label, Checkbox, Group, Radio, Edit, Input, List, Listview, ListviewItem, Tree-
view, TreeviewItem, Graphic, Progress và Slider là có thể được thay đổi màu nền.
• Control Progress sẽ không được vẽ với màu khác nếu sử dụng "Windows XP style"
• Các nút bấm (button) sẽ luôn được vẽ lại theo style của Windows Classic. Mặc khác hàm này
chỉ có tác dụng nếu các nút bấm này không được tạo với style $BS_ICON.
• Những phiên bản trước của AutoIt (v3.0.102) sử dụng định dạng màu BGR , những phiên bản
mới hơn sử dụng RGB theo mặc định. Tuy nhiên bạn có thể thay đổi điều này bằng lựa chọn
ColorMode.
7.5.6 GUICtrlSetData
Chỉnh sửa dữ liệu hiển thị trên control.
GUICtrlSetData ( controlID, data [, default] )
Các tham số
[tùy chọn] với Combo, List : giá trị sẽ làm mặc định
Với Edit, Input : nếu bạn định nghĩa nó không phải là chuỗi rỗng "" , chuỗi
default
"data" được sẽ được chèn vào vị trí của con nháy (caret) , không viết đè
chuỗi gốc.
– Nếu "data" trùng với một mục nhập đã tồn tại , nó sẽ được gán như mặc định
– Nếu "data" bắt đầu với một ký tự ngăn cách (GUIDataSeparatorChar) hoặc chuỗi rỗng ,
danh sách trước đó sẽ bị hủy.
• Để cập nhật văn bản cho một cột chỉ định , thì chỉ cần bỏ qua những cột khác. Ví dụ , muốn
cập nhật tiêu đề cho cột thứ ba , ta gán "||new_text"
• Nếu "new_text" là rỗng , cột và mục con (subitem) trong cột sẽ bị xóa. Ví dụ , "|" sẽ xóa cột
và subitem thứ hai , "" sẽ xóa cột/subitem thứ nhất.
7.5.7 GUICtrlSetFont
Thiết lập font chữ cho control
GUICtrlSetFont (controlID, size [, weight [, attribute [, fontname]]] )
Các tham số
• Theo mặc định , control sẽ sử dụng font được thiết lập từ GUISetFont
• Vài control như Label , mặc định giá trị 8.5 có thể được thay bằng 9 theo ghi nhận từ Windows
Theme
• Xem Appendix để có được một danh sách đầy đủ về các font của windows
7.5.8 GUICtrlSetOnEvent
Định nghĩa một hàm bởi người sử dụng và hàm này sẽ được gọi mỗi khi control được click vào
GUICtrlSetOnEvent ( controlID, "function" )
Các tham số
controlID: ID của control , được trả về từ hàm GUICtrlCreate. . . .
function: Tên của hàm sẽ gọi khi cần control được click
Giá trị trả về
Th. Công : Trả về 1
Hỏng : Trả về 0
Chú ý
• Các hàm OnEvent (theo sự kiện) chỉ được gọi khi lựa chọn GUIOnEventMode được thiết lập
sang giá trị 1 – trong chế độ này thì chế độ GUIGetMsg sẽ KHÔNG được sử dụng
• Khi user-function được gọi , id của control có thể được truy lại bằng macro @GUI_CTRLID.
• Nếu bạn cần handle của cửa sổ và handle của control thì có thể truy lại với macro @GUI_WINHANDLE
hoặc @GUI_CTRLHANDLE.
• Nếu hàm là một chuỗi rỗng "", thì không có gì xảy ra khi bạn click vào control.
7.5.9 GUICtrlSetPos
Thay đổi vị trí của control trên cửa sổ GUI
GUICtrlSetPos ( controlID, left, top [, width [, height]] )
Các tham số
7.5.10 GUICtrlSetState
Thay đổi trạng thái của control
GUICtrlSetState ( controlID, state )
Các tham số
controlID : ID của control , được trả về từ hàm GUICtrlCreate. . . .
state : Xem bảng trạng thái bên dưới
Giá trị trả về
Th. Công : Trả về 1
Hỏng : Trả về 0
Chú ý
Bảng trạng thái
State Miêu tả
Không thay đổi 0
• Các trạng thái có thể được cộng lại với nhau để có đa thuộc tính , ví dụ như $GUI_DISABLE
+ $GUI_HIDE sẽ làm cho control bị vô hiệu và ẩn đi.
• Nếu control AVI bị làm ẩn với $GUI_HIDE , nó nên được đóng lại với $GUI_AVICLOSE.
• Trạng thái của menu ngữ cảnh "contextmenu" không thể bị thay đổi
• Trạng thái của menu hoặc menuitem không thể được ẩn.
• Trạng thái của một "listviewitem" có thể bị thay đổi nếu nó liên kết với một Listview mà listview
này được tạo với style mở rộng $LVS_EX_CHECKBOXES. $GUI_FOCUS và $GUI_NOFOCUS
có thể được sử dụng trên listviewitem riêng biệt , style $LVS_SHOWSELALWAYS sẽ làm cho
mục được chọn luôn hiển thị thậm chí nó không có tiêu điểm.
• ! Thông tin quan trọng đối với $GUI_EXPAND : trạng thái này chỉ hữu dụng cho các Tree-
ViewItem. Nếu bạn muốn sử dụng hành động này , ít nhất phải có một nhánh-con trong
TreeView mà bạn đã tạo !
• Nếu bạn muốn chọn mục khác trong một TreeView , bạn có thể dùng $GUI_FOCUS – TreeView
mẹ sẽ lấy tiêu điểm của cửa sổ và mục được chỉ định sẽ bị đánh dấu như là được chọn
• Nếu muốn thiết lập một mục trong TreeView làm mục mặc định , có nghĩa là nó sẽ bị vẽ
in đậm. Bạn có thể gọi $GUI_DEFBUTTON – để tắt nó thì sử dụng một giá trị khác
$GUI_DEFBUTTON, chẳng hạn như 0. Trạng thái này sẽ không được trả về bởi GUICtrl-
GetState.
• Chỉ việc lôi-kéo một ListViewItem sẽ khởi động tiến trình kéo và thả (drag&drop). Macro
@GUI_DRAGID sẽ là ID của ListView
7.5.11 GUICtrlSetStyle
Thay đổi style cho control
GUICtrlSetStyle ( controlID, style [, exStyle] )
Các tham số
7.6 Xử lý sự kiện
7.6.1 Khái quát
Khi bạn tạo ra một cửa sổ và các thành phần con trên đó thì tất nhiên chúng phải được dùng cho
một mục đích mà bạn đã vạch ra , nhập liệu, vẽ, chơi nhạc, tìm kiếm file,. . . . Nhưng làm sao biết
được rằng cái gì đang diễn ra trên GUI của bạn , phím nào vừa được nhấn ? chuột trái vừa nhấp
ở đâu ? mục nào được chọn ?. . . . Tất cả những cái này chúng ta sẽ nắm bắt được bởi vì chúng do
windows tạo ra và AutoIt sẽ cung cấp cho chúng ta cách để biết được và xử lý được những sự kiện
đã và đang diễn ra trên cửa sổ.
AutoIt hỗ trợ cho ta hai phương pháp để xử lý sự kiện :
đảm bảo rằng hàm được gọi nhiều lần trong một giây , ngược lại có thể làm cho GUI của bạn không
có phản ứng.
Dạng cơ bản của vòng lặp thông điệp
Dạng chung của vòng lặp thông điệp có thể trình bày như sau :
While 1
$msg = GUIGetMsg()
...
...
WEnd
Thông thường một vòng lặp khép kín như trên sẽ làm cho tần suất CPU lên 100
Các sự kiện của GUI
Có ba loại thông điệp sự kiện mà GUIGetMsg sẽ trả về :
• No Event
• Control Event
• System Event
No Event
Khi không có sự kiện nào xảy ra , hàm GUIGetMsg sẽ trả về giá trị 0. Đây là sự kiện phổ biến
nhất trong các GUI thông thường
Control Event
Khi một control được click hoặc thay đổi thì một sự kiện sẽ được gửi đi , sự kiện này xảy ra trên
control nên được gọi là Control Event . Thường thì sự kiện này là một số nguyên dương cho biết
controlID (định danh của control trên GUI, được tạo ra bởi hàm GUICtrlCreate... ) nào đang/vừa
được tương tác
System Event
Các sự kiện hệ thống – như đóng một GUI – là một số âm . Các sự kiện khác nhau được định nghĩa
trong thư viện GUIConstantsEx.au3. Dưới đây là các sự kiện phổ biến thường hay dùng :
$GUI_EVENT_CLOSE
$GUI_EVENT_MINIMIZE
$GUI_EVENT_RESTORE
$GUI_EVENT_MAXIMIZE
$GUI_EVENT_PRIMARYDOWN
$GUI_EVENT_PRIMARYUP
$GUI_EVENT_SECONDARYDOWN
$GUI_EVENT_SECONDARYUP
$GUI_EVENT_MOUSEMOVE
$GUI_EVENT_RESIZED
$GUI_EVENT_DROPPED
Ví dụ GUI
Ở đây chúng ta sẽ bắt đầu với chương trình hello world đơn giản như sau :
#include <GUIConstantsEx.au3>
GUICreate("Hello World", 200, 100)
GUICtrlCreateLabel("Hello world! How are you?", 30, 10)
GUICtrlCreateButton("OK", 70, 50, 60)
GUISetState(@SW_SHOW)
Sleep(2000)
Đoạn chương trình trên sẽ hiển thị một cửa sổ với một dòng văn bản "Hello world ! How are you ? "
, một nút bấm và sẽ thoát sau 2 giây.
Và bây giờ chúng ta sẽ hoàn tất chương trình trên bằng việc sử dụng vòng lặp thông điệp , lúc này
bạn sẽ thấy mọi thứ linh động và hữu ích hơn.
#include <GUIConstantsEx.au3>
GUICreate("Hello World", 200, 100)
GUICtrlCreateLabel("Hello world! How are you?", 30, 10)
$okbutton = GUICtrlCreateButton("OK", 70, 50, 60)
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
Select
Case $msg = $okbutton
MsgBox(0, "GUI Event", "You pressed OK!")
Case $msg = $GUI_EVENT_CLOSE
MsgBox(0, "GUI Event", "You clicked CLOSE! Exiting...")
ExitLoop
EndSelect
WEnd
Mọi thứ như bạn thấy đấy , thật dễ dàng. Bạn có thể tạo cửa sổ và các control rồi thêm vào các
mệnh lệnh cho chúng xử lý. Tuy nhiên đây chỉ là một ví dụ rất đơn giản nhưng cũng rất cơ bản và
bạn nên hiểu rõ. Khi thành thạo bạn có thể làm ra những thứ khác hay hơn nhiều.
GUIGetMsg nâng cao và chế độ nhiều cửa sổ
Các định danh (ID) của control là duy nhất , thậm chí khi bạn có nhiều cửa sổ thì đoạn mã của bạn
vẫn sẽ làm việc tốt . Tuy nhiên , khi xử lý các sự kiện như $GUI_EVENT_CLOSE hoặc $GUI_MOUSEMOVE
bạn cần phải biết được GUI nào đã phát ra thông điệp này để mà ra lệnh cho đúng. Giả sử rằng bạn
vừa tạo ra hai cửa sổ và chỉ muốn thoát chương trình khi cửa sổ thứ nhất gửi đi thông điệp Close,
nếu cửa sổ thứ hai cũng phát thông điệp Close thì chỉ ẩn GUI đi, chứ không thoát ứng dụng. Muốn
làm được điều này bạn phải gọi GUIGetMsg giống như sau :
$msg = GUIGetMsg(1)
Khi gọi với tham số là 1 , giá trị trả về bây giờ không còn là một số nguyên nữa mà thay vào đó là một
mảng. Sự kiện nào vừa xảy ra sẽ được lưu trong phần tử đầu tiên (array[0])vthngtinbsungnhhandlecacasØphtrask
. Ví dụ ở trên sẽ được sửa lại để làm việc với hai cửa sổ và bạn sẽ hiểu cách viết mã xử lý chúng như
thế nào .
#include <GUIConstantsEx.au3>
$mainwindow = GUICreate("Hello World", 200, 100)
GUICtrlCreateLabel("Hello world! How are you?", 30, 10)
$okbutton = GUICtrlCreateButton("OK", 70, 50, 60)
$dummywindow = GUICreate("Dummy window for testing ", 200, 100, -1, 100)
GUISetState(@SW_SHOW, $dummywindow)
GUISwitch($mainwindow)
GUISetState()
While 1
$msg = GUIGetMsg(1)
Select
Case $msg[0] = $okbutton
MsgBox(0, "GUI Event", "You pressed OK!")
Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $mainwindow
MsgBox(0, "GUI Event", "You clicked CLOSE on the main window! Exiting...")
ExitLoop
EndSelect
WEnd
Đầu tiên , có một sự thay đổi quan trọng là việc xuất hiện của hàm GUISwitch – khi một cửa-sổ-mới
(new window) được tạo ra thì nó trở thành cửa sổ mặc định cho các thao tác của GUI trong tương
lai (bao gồm việc tạo control). Trong ví dụ này , chúng ta muốn làm việc với của sổ chính "Hello
world" , không phải cửa sổ dummy , nên phải switch về cửa sổ chính. Một vài hàm về GUI cho phép
bạn sử dụng handle cửa sổ trong tham số để tự động chuyển sang GUI cần chứa control mà không
cần phải dùng đến lệnh GUISwitch. Và chúng ta đã có một trường hợp trong đoạn code trên :
GUISetState(@SW_SHOW, $dummywindow)
Sự thay đổi tiếp theo là cách gọi hàm GUIGetMsg và kiểm tra các sự kiện – để ý việc dùng $msg[0]
và $msg[1] – bây giờ chúng ta sẽ thoát khỏi chương trình khi event Close được gởi đi và nó phải xuất
phát từ cửa sổ chính.
While 1
Sleep(1000) ; khoảng dừng của vòng lặp
WEnd
Func Event1()
; Code to handle event goes here
EndFunc
Func Event2()
; Code to handle event goes here
EndFunc
GUI Events
Trong chế độ OnEvent , GUI của bạn sẽ phát ra các sự kiện sau :
• Control Event
• System Event
Cả hai loại sự kiện trên sẽ gọi một hàm do người viết chương trình thiết lập , hàm này có thể được
chỉ định cho GUI (sử dụng hàm GUISetOnEvent) hoặc chỉ định xử lý cho control (sử dụng hàm
GUICtrlSetOnEvent) . Nếu một sự kiện nào đó xảy ra mà AutoIt không tìm thấy hàm làm việc
tương ứng thì nó sẽ bị bỏ qua. Bên trong hàm được gọi ta có thể sử dụng các macro khác nhau do
AutoIt cung cấp để hỗ trợ việc xử lý các sự kiện
@GUI_CTRLID ID của control đang gửi thông điệp hoặc ID của sự kiện hệ thống
@GUI_WINHANDLE Handle của GUI đã gửi đi thông điệp
@GUI_CTRLHANDLE Handle của control đã gửi đi thông điệp (nếu có thể dùng được)
Chú ý : Bạn có thể sử dụng một hàm cho nhiều sự kiện , điều bạn cần làm trong trường hợp này
là tạo ra các hành động khác nhau dựa trên macro @GUI_CTRLID . Ví dụ , bạn có thể đăng ký tất cả
sự kiện hệ thống vào trong một hàm rồi tùy trường hợp mà viết lệnh.
Control Event
Khi bạn nhấp hoặc thay đổi một control thì một sự kiện được gửi đi . Sự kiện đó được gửi vào
trong một hàm đã định nghĩa và đã được thiết lập trong GUICtrlSetOnEvent. Bên trong hàm này
thì macro @GUI_CTRLID mang giá trị là controlID được trả về khi tạo bằng hàm GUICtrlCreate....
System Event
Các sự kiện hệ thống – ví dụ như close một gui – thì cũng được gởi đi theo cách tương tự như
Control Event . Tuy nhiên sự kiện lại được gửi vào hàm được thiết lập trong GUISetOnEvent. Sự
kiện hệ thống có thể mang những giá trị sau :
$GUI_EVENT_CLOSE
$GUI_EVENT_MINIMIZE
$GUI_EVENT_RESTORE
$GUI_EVENT_MAXIMIZE
$GUI_EVENT_PRIMARYDOWN
$GUI_EVENT_PRIMARYUP
$GUI_EVENT_SECONDARYDOWN
$GUI_EVENT_SECONDARYUP
$GUI_EVENT_MOUSEMOVE
$GUI_EVENT_RESIZED
$GUI_EVENT_DROPPED
Ví dụ
Chúng ta sẽ bắt đầu với chương trình hello world đơn giản sau :
#include <GUIConstantsEx.au3>
GUICreate("Hello World", 200, 100)
GUICtrlCreateLabel("Hello world! How are you?", 30, 10)
GUICtrlCreateButton("OK", 70, 50, 60)
GUISetState(@SW_SHOW)
Sleep(2000)
Sử dụng chế độ OnEvent , chúng ta sẽ viết lại để hoàn tất đoạn mã trên :
#include <GUIConstantsEx.au3>
Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
$mainwindow = GUICreate("Hello World", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
GUICtrlCreateLabel("Hello world! How are you?", 30, 10)
$okbutton = GUICtrlCreateButton("OK", 70, 50, 60)
GUICtrlSetOnEvent($okbutton, "OKButton")
GUISetState(@SW_SHOW)
While 1
Sleep(1000) ; Idle around
WEnd
Func OKButton()
Như bạn thấy , nó rất đơn giản. Mặc dù chỉ là ví dụ cơ bản nhưng sẽ là cái nền để bạn tạo ra những
cái hay hơn đấy.
Thao tác nâng cao và chế độ nhiều cứa sổ
Chúng ta cũng đã biết rằng các control ID là duy nhất , cho dù bạn có nhiều cửa sổ và nhiều
control thì bạn vẫn có thể xử lý chúng theo định danh mà bạn đã chọn. Tuy nhiên vấn đề là xử lý
như thế nào ?
Ở đây sẽ trình bày một ví dụ tương tự như ví dụ trên , nhưng có thêm một cửa sổ dummy nữa :
#include <GUIConstantsEx.au3>
Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
$mainwindow = GUICreate("Hello World", 200, 100)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
GUICtrlCreateLabel("Hello world! How are you?", 30, 10)
$okbutton = GUICtrlCreateButton("OK", 70, 50, 60)
GUICtrlSetOnEvent($okbutton, "OKButton")
$dummywindow = GUICreate("Dummy window for testing ", 200, 100, 500, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
GUISetState(@SW_SHOW, $dummywindow)
GUISwitch($mainwindow)
GUISetState(@SW_SHOW)
While 1
Sleep(1000) ; Idle around
WEnd
Func OKButton()
;Note: at this point @GUI_CTRLID would equal $okbutton
MsgBox(0, "GUI Event", "You pressed OK!")
EndFunc
Func CLOSEClicked()
;Note: at this point @GUI_CTRLID would equal $GUI_EVENT_CLOSE,
;@GUI_WINHANDLE will be either $mainwindow or $dummywindow
If @GUI_WINHANDLE = $mainwindow Then
MsgBox(0, "GUI Event", "You clicked CLOSE in the main window! Exiting...")
Exit
EndIf
EndFunc
Đầu tiên , có một sự thay đổi quan trọng là việc xuất hiện của hàm GUISwitch – khi một cửa-sổ-mới
(new window) được tạo ra thì nó trở thành cửa sổ mặc định cho các thao tác của GUI trong tương
lai (bao gồm việc tạo control). Trong ví dụ này , chúng ta muốn làm việc với của sổ chính "Hello
world" , không phải cửa sổ dummy , nên phải switch về cửa sổ chính. Một vài hàm về GUI cho phép
bạn sử dụng handle cửa sổ trong tham số để tự động chuyển sang GUI cần chứa control mà không
cần phải dùng đến lệnh GUISwitch. Và chúng ta đã có một trường hợp trong đoạn code trên :
GUISetState(@SW_SHOW, $dummywindow)
Cũng xin nhắc là chúng ta sử dụng hàm OnEvent để điều khiển nút "close" cho cả hai cửa sổ và
sau đó sử dụng macro @GUI_WINHANDLE để xét xem cửa sổ nào vừa gởi đi sự kiện. Chúng ta chỉ đóng
GUI khi nút close được nhấn và thông điệp đó xuất phát từ cửa sổ chính (không phải dummy) .
Nhưng bạn cũng có thể sử gán cho mỗi cửa sổ một hàm khác nhau để xử lý nếu bạn bạn thích.
Ví dụ mẫu
EndFunc ;==>_Quit
83
8.2. A TEXT TYPER(ADVANCED) Chương 8. Ví dụ mẫu
i knew the happy life was right here . ’’ Every thing is never perfect,
i have to accept . ’’ " & @CRLF
$str6 = "When i see the winter of my life , when i write these lines ,
all left ever and ever, all will never return . Outside the window , sights are
a white by snow , the wind ’s still blowing , it’s still cold, very cold. "
$str7 = "Maybe this’s final winter i can look , think and count leaves ..."
$def_str = $str1 & $str2 & $str3 & $str4 & $str5 & $str6 & $str7
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$string = $def_str
$len = StringLen($string)
$i = 0
$run = 0
$nDelay = 50
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$gui = GUICreate("A Text Typer", 700, 500)
$eMainText = GUICtrlCreateEdit("", 5, 5, 690, 420,
$ES_AUTOVSCROLL + $WS_VSCROLL+ $ES_READONLY)
GUICtrlSetFont(-1, 10, 400, default, "Tahoma")
$text_ShowSource = GUICtrlCreateLabel("Source : <default text>", 8, 435, 690, 20)
$text_delay = GUICtrlCreateLabel("Delay (miliSecond) :" , 10, 470, 100, 30)
$eDelay = GUICtrlCreateInput($nDelay, 115, 467, 40, 20, $ES_NUMBER)
$btnPlayPause = GUICtrlCreateButton("Start", 170, 462, 80, 30)
$btnStop = GUICtrlCreateButton("Stop", 250, 462, 80, 30)
$btnOpenText = GUICtrlCreateButton("Open text", 350, 462, 80, 30)
$btnLoadDefault = GUICtrlCreateButton("Load default text", 430, 462, 110, 30)
$text_status = GUICtrlCreateLabel("Status : Stoped...", 580, 470, 150, 30)
GUISetState()
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
while 1
$msg = GUIGetMsg()
Switch $msg
case $GUI_EVENT_CLOSE
ExitLoop
Case $btnPlayPause
If $run=0 Or $run=2 Then; if state is "stoped" or "paused", then
$run = 1 ; set state to "start"
update_status(1) ; set new text for buttons and status
$nDelay = Abs(Int(GUICtrlRead($eDelay)));read delay value for speed type
$timer2type = _Timer_SetTimer($gui, $nDelay, "TypeText")
; create a new timer (note : this will use current valure of $i and $run)
GUICtrlSetState($eDelay, $GUI_DISABLE) ; disable input of delay
ElseIf $run=1 Then ; if state is "typing" , then
$run = 2 ; change state to "stoped"
update_status(2) ; set new texts for buttons
GUICtrlSetState($eDelay, $GUI_ENABLE) ; enable delay s input
_Timer_KillTimer($gui, $timer2type)
; kill timer to stop typing text
;(note : current value will be used on next time when i create new timer)
EndIf
Case $btnStop
_Timer_KillTimer($gui, $timer2type)
$run = 0
$i = 0
update_status(0)
GUICtrlSetState($eDelay, $GUI_ENABLE)
Case $btnOpenText
_Timer_KillTimer($gui, $timer2type) ; kill timer to stop typing text
If BrowseText() Then $i = 0 ; check if a new file is opened successfully
;, if yes , then reset position which is reading in text
$nDelay = Abs(Int(GUICtrlRead($eDelay))) ; update delay value
$timer2type = _Timer_SetTimer($gui, $nDelay, "TypeText")
; create a new timer for typing text
$run = 1 ; set state this time is RUNNING
update_status(1) ; update text on button and status
Case $btnLoadDefault
_Timer_KillTimer($gui, $timer2type)
$i = 0
$run = 0
update_status(0)
$string = $Def_str
GUICtrlSetData($text_ShowSource, "Source : <Default text>")
$nDelay = Abs(Int(GUICtrlRead($eDelay)))
$timer2type = _Timer_SetTimer($gui, $nDelay, "TypeText")
$run = 1
update_status(1)
EndSwitch
WEnd
;==============================================================
; this func will set new texts for buttons and status
Func update_status($nState)
If $nState=0 Then ; neu trang thai la stop
GUICtrlSetData($btnPlayPause, "Start")
GUICtrlSetData($text_status, "Status : Stoped...")
ElseIf $nState=1 Then ; neu trang thai la play
GUICtrlSetData($btnPlayPause, "Pause")
GUICtrlSetData($text_status, "Status : Typing...")
Else ; neu trang thai la pause
GUICtrlSetData($btnPlayPause, "Start")
GUICtrlSetData($text_status, "Status : Paused...")
EndIf
EndFunc
; this func will show open dialog for user who choose a text file
and if success then continue to type with new texts
Func BrowseText()
Local $filePath, $file
$filePath = FileOpenDialog("Open a text file", @MyDocumentsDir,
"Text (*.txt) | All file (*.*)", 1+2)
If @error <> 1 Then
$file = FileOpen($filePath, 0)
If $file =-1 Then
MsgBox(16, "Error", " I’m sorry. A error occured when I read file. ")
Return 0
Else
$string = FileRead($file)
FileClose($file)
GUICtrlSetData($text_showSource , "Source : " & $filepath)
EndIf
Else
return 0
EndIf
Return 1
EndFunc
; it’s important , this will type text and show it on GUI
Func TypeText($hWnd, $Msg, $iIDTimer, $dwTime)
$i += 1
If ($i>StringLen($string)) Then
$i=0
$run = 0
update_status(0)
GUICtrlSetData($text_status, "Status : Completed")
_Timer_KillTimer($gui, $timer2type)
Return
EndIf
$temp_str = StringLeft($string, $i)
$condition = StringRight($temp_str, 1) <> @CR And StringRight($temp_str, 1)<>@LF
If $condition Then
$temp_str &= "_"
GUICtrlSetData($eMainText, $temp_str)
Else
Sleep(400)
EndIf
EndFunc
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $btnStartStop
If GUICtrlRead($btnStartStop)="Start" Then
GUICtrlSetData($btnStartStop, "Stop")
GUICtrlSetState($eSpeed, $GUI_DISABLE)
$nDelay = Abs(Int(GUICtrlRead($eSpeed)))
$Timer_Type = _Timer_SetTimer($gui , $nDelay, "_Type_Text")
Else
_Timer_KillAllTimers($gui)
GUICtrlSetData($btnStartStop, "Start")
GUICtrlSetState($eSpeed, $GUI_ENABLE)
$count = 0
EndIf
Case $btnOpen
_Timer_KillAllTimers($gui)
If BrowseFile() Then $count = 0
GUICtrlSetState($eSpeed, $GUI_DISABLE)
$nDelay = Abs(Int(GUICtrlRead($eSpeed)))
$Timer_Type = _Timer_SetTimer($gui, $nDelay, "_Type_Text")
GUICtrlSetData($btnStartStop, "Stop")
EndSwitch
WEnd
;====================================================================
Func BrowseFile()
Local $path, $file, $IsError=0
$path = FileOpenDialog("Open text file", @MyDocumentsDir,
"Text (*.txt)|All file (*.*)" , 1+2)
If @error=1 Then
MsgBox(16, "Error", "Sorry. I can’t open file. Previous texts will be continued.")
$IsError = 1
Else
$file = FileOpen($path, 0)
If $file=-1 Then
MsgBox(16, "Error", "Sorry. I can’t read this file")
$IsError = 1
EndIf
$str = FileRead($file)
FileClose($file)
EndIf
If $IsError=0 Then
Return 1 ; open file successfully
Else
Return 0 ; fail
EndIf
EndFunc
; important function , this will type text automaticly
Func _Type_Text($hwnd, $msg, $wParam, $lParam)
$count += 1
If $count>StringLen($str) Then
$count = 0
_Timer_KillAllTimers($gui)
GUICtrlSetData($btnStartStop, "Start")
GUICtrlSetState($eSpeed, $GUI_ENABLE)
Return
EndIf
$temp = StringLeft($str, $count)
$temp &= "|"
GUICtrlSetData($eMainEdit, $temp)
EndFunc