Download as pdf or txt
Download as pdf or txt
You are on page 1of 88

AUTOIT

HƯỚNG DẪN SỬ DỤNG AUTOIT

Biên soạn : Đỗ Minh Tuân. Email: xuxutit@gmail.com


Tác giả : Lê Quốc Lường. Email: qclgle@gmail.com

Nam Định, Ngày 12 tháng 07 năm 2009


Lời tác giả

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

1.1 Giới thiệu về AutoIt


AutoIt v3 là một ngôn ngữ lập trình được cung cấp miễn phí, có dạng kịch bản giống như BASIC
được thiết kế để tự động hóa các GUI (Graphic User Interface : giao diện người dùng) và các thao
tác thường dùng. Nó là sự phối hợp của việc giả lập nhấn phím , di chuyển chuột và thao tác trên
cửa sổ/control (control là các đối tượng tương tác được trên cửa sổ, ví dụ như là button - nút bấm)
để thực hiện tự động các tác vụ theo cách thức mà các ngôn ngữ khác không thể làm hoặc làm không
chuẩn xác. AutoIt có dung lượng rất nhỏ gọn, có thể chạy độc lập trên tất cả các phiên bản của
Windows mà không cần các runtime để làm nền. Tuy nhiên, kể từ phiên bản v3.3, AutoIt đã không
còn hỗ trợ cho Windows 9x và Win NT 4.0.
Ban đầu AutoIt được thiết kế để tự động cấu hình cho hàng ngàn máy PC. Theo thời gian, AutoIt
trở thành một ngôn ngữ đầy sức mạnh với sự hỗ trợ các biểu thức phức tạp, hàm do người dùng tự
định nghĩa, các vòng lặp và mọi thứ mà một người lập trình kịch bản dày dặn mong đợi.
Ở đây là các tính năng chính :

• Dễ học vì các cú pháp đơn giản

• Giả lập được việc nhấn phím và di chuyển chuột

• Thao tác được với các tiến trình và cửa sổ

• Tương tác được với các control trên cửa sổ

• File mã có thể được biên dịch thành một file thi hành duy nhất

• Cho phép tạo GUI - giao diện người dùng

• Hỗ trợ COM (Component Object Model)

• Hỗ trợ biểu thức thông thường

• Gọi một cách có định hướng các DLL mở rộng và các hàm API

• Tương thích với tất cả phân hệ của Windows

• Tài liệu chi tiết và cộng đồng rộng hỗ trợ lớn

• Làm việc với User Account Control (UAC) trên Vista

• Hỗ trợ Unicode và x64

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.

1.2 CẤU TRÚC THƯ MỤC CÀI ĐẶT AUTOIT


Các file và thư mục Miêu tả
(Thư mục cấp trên)
AutoIt3.exe Chuong trình chính của AutoIt để chạy các file script
AutoIt3_ x64.exe Phiên bản x64 của AutoIt (nếu có cài đặt).
AU3Info.exe AutoIt Window Info Tool – cung cấp thông tin từ cửa sổ.
AU3Info_ x64.exe Phiên bản x64 của AutoIt (nếu có cài đặt).
AU3Check.exe Trình kiểm tra cú pháp.
AutoIt.chm File trợ giúp, sử dụng AutoIt3.chm và UDFs3.chm
Uninstall.exe Trình gỡ bỏ AutoIt
AutoIt v3 Website.url Shortcut để truy cập vào website : http://www.autoitscript.com/
autoit3/
(Aut2Exe)
Icons\ Chứa các icon (*.ico) để dùng cho file au3.
Aut2Exe.exe Trình biên dịch file nguồn thành file exe
Aut2Exe_ x64.exe Phiên bản x64 của AutoIt (nếu có cài đặt).
AutoItSC.bin Mẫu có thể thực thi cho mã đã được biên dịch
AutoItSC_ x64.bin Mẫu có thể thực thi x64 cho mã đã được biên dịch.
UPX.exe Trình nén UPX để nén kích thước của file mã khi dịch sang file exe
( Examples)
GUI\ Các ví dụ về GUI được viết trong AutoIt.
Helpfile\ Chứa các file script ví dụ được dùng trong file help
( Extras)
AutoUpdateIt\ Chứa một script giúp cho việc cập nhật phiên bản mới của AutoIt3.
Editors\ Chứa các định nghĩa màu cú pháp cho vài trình soạn thảo phổ biến.
Exe2Aut\ Chứa các công cụ chuyển file exe sang file script nguồn.
SQLite\ Chứa tiện ích dòng lệnh SQLite và file trợ giúp
v2_to_v3_Converter\ Chứa công cụ giúp chuyển đổi cú pháp AutoIt từ v2.64 sang AutoIt
v3.
Icons Chứa icon được dùng cho file au3
Include Chứa các file thư viện với các hàm được định nghĩa sẵn
AutoItX Chứa một phiên bản DLL của AutoIt v3 để cung cấp một tập hợp con
các tính năng của giao diện ActiveX/COM và DLL.
SciTe Chứa trình biên soạn văn bản SciTe để viết script
Xin nhắc lại là để chạy được các đoạn script của AutoIt, chỉ yêu cầu có file AutoIt3.exe. Nếu bạn
biên dịch một file script sang file có thể thực thi thì người dùng khác không cần phải cài đặt AutoIt
mà vẫn có thể chạy được file script đã biên dịch.
(Ngoại lệ : dưới Windows NT4, file PSAPI.dll thì cần thiết trong đường dẫn hoặc trong thư mục
cài đặt AutoIt cho các hàm Process. . . () làm việc.)

Biên soạn : Đỗ Minh Tuân Trang 4 Tác giả: Lê Quốc Lường


Chương 2

Sử dụng AutoIt

2.1 Soạn Script


Trong AutoIt đã được tích hợp sẵn trình soạn thảo SciTe cho phép ta viết và chạy các đoạn script
một cách tự động. Tuy nhiên đây là bản rút gọn cho nên đã được lượt bỏ vài tính năng và công cụ
bổ sung. Phiên bản đầy đủ các bạn có thể tải về từ AutoIt
Ở đây tôi xin nói thêm vài điểm lưu ý trong việc soạn mã.

• 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)

2.2 Biên dịch Script


Khi biên dịch một file script thành file exe, bạn có thể yên tâm rằng nó sẽ chạy được trên mọi máy
tính cài hệ điều hành Windows mà không cần bất cứ một runtime nào để làm nền. Bởi vì tất cả các
#include cũng sẽ được nén, mã hóa và kết hợp vào trong một file duy nhất. Nhưng bạn cần phải
chắc chắn một điều rằng file script của bạn không có lỗi cú pháp, bởi vì compiler không thực hiện
kiểm tra cú pháp khi biên dịch sang file *.exe.
Muốn thực hiện việc biên dịch file script, có 3 cách :

• 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.

Biên soạn : Đỗ Minh Tuân Trang 6 Tác giả: Lê Quốc Lường


Chương 3

Tham khảo ngôn ngữ

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

Ví dụ : 2 + 4 * 10 sẽ có kết quả là 42:


Bởi vì phép nhân * có ưu tiên cao hơn phép cộng + , nên 4 * 10 (bằng 40) và 2 + 40 (bằng 42).
Để có kết quả tính toán chính xác bạn nên sử dụng cặp dấu ngoặc đơn ( ) để nhóm các biểu thức
con một cách thích hợp.. Mặc dù không được đề cập, song, dấu ngoặc đơn là toán tử có độ ưu tiên
cao nhất trong tất cả các toán tử.
Vd : (2 + 4) * 10 bằng 60. NOT (12+3)/5 sẽ bằng 0
Đối với toán tử logic AND, OR, ta có ví dụ sau :
Vd 1 : If MyFunc1() OR MyFunc2() Then
(MyFunc2() sẽ không được gọi nếu như MyFunc1() trả về True)
Vd 2 : If MyFunc1() AND MyFunc2() Then
(MyFunc2() sẽ không được gọi nếu MyFunc1() trả về False)

3.2 Kiểu dữ liệu


Trong AutoIt chỉ có một loại dữ liệu gọi là Variant (tạm dịch là biến). Một biến có thể chứa dữ
liệu theo kiểu chuỗi (string) hoặc là kiểu số (number) tùy vào tình huống sử dụng. Ví dụ như nếu
bạn nhân hai biến với nhau thì lúc này biến có kiểu number, còn nếu bạn sử dụng phép toán ghép
chuỗi với hai biến thì chúng sẽ được đối xử như các chuỗi ký tự. Ví dụ :

10 * 20 sẽ bằng số 200 (* là nhân hai biến với nhau)


10* "20" cũng sẽ bằng số 200
hoặc "10" * "20" cũng bằng số 200
10 & 20 sẽ trả về một chuỗi là "1020" (& là phép toán ghép chuỗi)

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).

3.2.1 KIỂU SỐ - NUMBER


Number có thể là số thập phân như : 3, 5.642 và -8
cũng có thể là số thập phân theo dạng khoa học,
ví dụ như 1.5e3 sẽ thay cho 1500 (vì 1.5*10^3)
hay hệ thập lục phân (hexa) : 0x409 hoặc 0xff4a.

Chú ý :

Biên soạn : Đỗ Minh Tuân Trang 8 Tác giả: Lê Quốc Lường


3.2. KIỂU DỮ LIỆU Chương 3. Tham khảo ngôn ngữ

• 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.

3.2.2 KIỂU CHUỖI - STRING


Chuỗi ký tự được rào trong cặp dấu ngoặc kép " " hoặc cặp dấu nháy đơn ’ ’. Ví dụ :
"this is a string"
’ Welcome to AutoIt ! ’
Mặc dù AutoIt hỗ trợ hai phương thức biểu diễn chuỗi nhưng khi sử dụng bạn phải sử dụng thống
nhất có trật tự, không thể bắt đầu rào chuỗi với dấu ngoặc kép, kết thúc chuỗi với dấu nháy đơn và
ngược lại. Ví dụ sau cho thấy chuỗi không hợp lệ :
" doctor for pc ’(sẽ báo lỗi khi chạy)
Tuy nhiên, trong trường hợp bạn muốn nhấn mạnh một nội dung nào đó trong chuỗi bằng dấu
ngoặc kép hoặc dấu nháy đơn thì AutoIt cũng hỗ trợ việc trộn hai dạng ký tự này. Và bạn phải nhớ
tính trật tự và đầy đủ trong khi sử dụng. Ví dụ :
’ It is a "black" web ’
"This "sentence" contains "lots" of "double-quotes". "
" It ’s a dog "
nhưng ’ it ’s a dog ’ (là một chuỗi bị lỗi)
Một biến kiểu chuỗi có thể chứa đến 2,147,483,647 ký tự (tương đương với 1651 quyển sách dày
500 trang, mỗi trang có 40 dòng, mỗi dòng có 65 ký tự)

3.2.3 KIỂU BOOLEAN


Kiểu boolean chỉ mang hai giá trị đúng hoặc sai (True/False). Trong nhiều trường hợp sử dụng thì
một kiểu boolean trả về False khi giá trị của biến đó là 0 hoặc là chuỗi rỗng "". Tất cả các trường
hợp khác 0 đều được xem như True, theo mặc định thì True bằng 1. Thông thường, các phép toán
logic AND, OR hoặc NOT thường được dùng với kiểu boolean trong việc thẩm định điều kiện.
Ví dụ :
$b1 = true
$b2 = false
$b3 = $b1 And $b2–> ($b3 sẽ bằng False)
$b2 = 5
$b3 = $b1 And $b2–> ($b3 sẽ bằng True)
$b3 = $b1 + $b2 –> ($b3 sẽ bằng 6)
$b3 = NOT $b3 –> ($b3 sẽ bằng 0)
Trong trường hợp bạn xử lý một biến boolean như một chuỗi thì :
một boolean là true sẽ chứa chuỗi "True"
một boolean là false sẽ chứa chuỗi "False"
ví dụ :
$b1 = true
$str = "test is : "
$string = $str & $b1 ($string sẽ chứa chuỗi "Test is : True")

Biên soạn : Đỗ Minh Tuân Trang 9 Tác giả: Lê Quốc Lường


3.3. DẠNG CHUNG Chương 3. Tham khảo ngôn ngữ

3.2.4 KIỂU NHỊ PHÂN - BINARY


Kiểu binary có thể lưu giữ mọi byte giá trị, chúng được chuyển đổi sang dạng hexa khi lưu trong
một biến chuỗi. Ví dụ : $bin = Binary("abc")
$str = string($bin) –> "0x616263"

3.2.5 KIỂU CON TRỎ - POINTER


Kiểu con trỏ dùng để lưu trữ địa chỉ bộ nhớ 32 bit hoặc 64 bit tùy vào phiên bản AutoIt được sử
dụng. Thực chất con trỏ là một số nguyên chỉ định vị trí của thành phần dữ liệu nào đó trong bộ nhớ.
Tuy nhiên, khi truy xuất trong AutoIt thì con trỏ sẽ được lưu ở dạng hexa trong một biến kiểu chuỗi.
Handle (tạm dịch là kênh hay địa chỉ trong bộ nhớ) của cửa sổ được trả về bởi hàm WinGetHandle
là một kiểu con trỏ, mang giá trị ở dạng hexa. Nếu muốn xem ở dạng thập phân bình thường ta dùng
hàm Number .
Mặc dù phần này trình bày nhiều kiểu dữ liệu mà AutoIt hỗ trợ nhưng trên thực tế, bạn chỉ cần
quan tâm đến hai kiểu chính đó là number và string. Đây chính là hai kiểu dữ liệu thường dùng nhất
khi viết script. Các kiểu khác dùng để tham khảo cho biết chứ thực chất chúng cũng được tạo nên từ
hai kiểu trên và thường chúng ít khi được dùng đến. Nếu bạn đã là một người sành sỏi về lập trình
thì việc này không cần phải bàn.

3.3 Dạng chung


DẠNG CHUNG
Một chương trình AutoIt do nhiều thành phần cấu thành, trong đó, biến, biểu thức, hàm, macro,...
đóng vai trò quan trọng. Tuy nhiên chúng chỉ là những "cá thể" độc lập mang một chức năng nhất
định. Tất cả chúng phải được kết hợp với nhau theo một cách thức hợp lý thì ta sẽ có được một
chương trình hoàn chỉnh. Các cách thức đó do chính AutoIt qui định và một đoạn mã chạy được có
dạng tổng quát như sau :
<chỉ định thư viện>
<khai báo các biến>
<các câu lệnh, biểu thức>
<các dòng miêu tả, ghi chú>
<gọi hàm hoặc định nghĩa hàm>
Ví dụ :

; chương trình đơn giản hiện thông điệp hello world


; và welcome to autoit
Global $m
$m = "Hello world"
MsgBox(0, "My Msg", $m)
MsgBox(0, "Msg", "Welcome to AutoIt")

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

Biên soạn : Đỗ Minh Tuân Trang 10 Tác giả: Lê Quốc Lường


3.3. DẠNG CHUNG Chương 3. Tham khảo ngôn ngữ

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.

3.3.1 THƯ VIỆN


Nói theo kiểu kỹ thuật, nếu rành về lập trình bạn có thể tự tạo ra một chương trình hữu ích, có tác
dụng chỉ chứa toàn những mệnh đề của chính bạn. Tuy nhiên điều này là hiếm hoi vì nó đòi hỏi rất
nhiều công sức và thời gian. Với bất kỳ một ngôn ngữ lập trình nào, không riêng gì AutoIt, những
người tạo ra chúng đều cung cấp cho chúng những chương trình con, mỗi chương trình con thực hiện
một chức năng nhất định mà ta thường gọi là hàm. Tập hợp tất cả các hàm này sẽ được chứa trong
một file thư viện, tùy vào lĩnh vực xử lý của hàm mà chúng được lưu trong các file thư viện tương
ứng. Ví dụ như thư viện Array chứa các hàm về quản lý mảng, thư viện Sound chứa các hàm dùng
để điều khiển âm thanh, thư viện Math cho các hàm toán học....
Với AutoIt thì những người cài đặt trình biên dịch đã viết sẵn đa số các hàm chung mà bạn sẽ
dùng. Cho nên sẽ có rất nhiều hàm mà bạn có thể sử dụng, không cần khai báo thư viện vì theo mặc
định chúng là hàm chuẩn luôn được đưa vào chương trình của bạn. Chỉ những hàm mà người ta liệt
kê nó vào UDF (User Defined Function - hàm do người sử dụng tạo sẵn, không phải hàm chuẩn) hoặc
những hàm nào có ghi chú thư viện thì bạn mới chỉ định thư viện khi viết chương trình. Nếu thích
bạn cũng có thể tạo một thư viện để chứa các hàm của riêng mình sau khi bạn hiểu được AutoIt.

3.3.2 CÁC CHÚ Ý


Đây là những chú ý quan trọng mà bạn nên ghi nhớ để có thể sử dụng AutoIT một cách hiệu quả.

• 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ụ :

; this is a first comment line


; this is a second comment
#cs
.......comment start
Comment 1
Comment 2
........
comment end

Biên soạn : Đỗ Minh Tuân Trang 11 Tác giả: Lê Quốc Lường


3.4. BIẾN VÀ HẰNG SỐ Chương 3. Tham khảo ngôn ngữ

#ce
MsgBox(0, "msg", "Welcome to AutoIT")

3.4 Biến và hằng số


3.4.1 KHAI BÁO BIẾN
Biến là một đại diện cho vùng địa chỉ nào đó trong bộ nhớ, mà ở đó dữ liệu được lưu trữ. Tuy
nhiên ở đây ta không đề cập đến vấn đề dữ liệu được chứa trong bộ nhớ như thế nào. Ta chỉ cần biết,
biến là một đại diện mang giá trị ta cần tính toán.
Trong AutoIt, một biến hợp lệ phải có tên được bắt đầu với ký tự $ và sau đó là các ký tự alpha(a-z,
A-Z), ký số (0-9) và dấu gạch dưới _ . Ví dụ :
$var1 $my_variable $123 $String_temp
$abc@ $love.baby --> đây là hai biến không hợp lệ
Để khai báo một biến, biến đó phải được tạo với một trong các từ khóa Global, Local hay Dim. Các
từ khóa này có chức năng giới hạn phạm vi tồn tại và sử dụng của biến. Ví dụ :
Global $var1, $title
Dim $m, $name

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

Biên soạn : Đỗ Minh Tuân Trang 12 Tác giả: Lê Quốc Lường


3.4. BIẾN VÀ HẰNG SỐ Chương 3. Tham khảo ngôn ngữ

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ụ :

; đoạn mã sau sẽ cho gọi calculator thay vì notepad


Dim $p = "notepad"
_modify()
Run($p)
Func _modify()
$p = "calc"
EndFunc

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.

3.4.2 KHAI BÁO HẰNG SỐ


Hằng số là một biến mang giá trị cố định và giá trị này chỉ được gán một lần khi khởi tạo. Bất kỳ
thao tác nào cố gắng thay đổi nội dung của hằng số đều là thao tác không hợp lệ.
Việc khai báo hằng số cũng giống như việc khai báo biến, nhưng bạn cần đặt thêm từ khóa Const.
sau Dim, Global hoặc Local. Có dạng như sau :

Biên soạn : Đỗ Minh Tuân Trang 13 Tác giả: Lê Quốc Lường


3.5. MẢNG Chương 3. Tham khảo ngôn ngữ

Const $pi = 3.14 ; hằng số cục bộ


Local $text = "Hello" ; hằng số cục bộ
Global Const $e = exp(1) ; hằng số toàn cục

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).

3.5.2 MẢNG MỘT CHIỀU (DANH SÁCH)


Mảng một chiều là dãy gồm nhiều mục liên tiếp nhau. Bạn cứ hình dung nó như là một cái danh
sách. Cũng có số thứ tự, cũng có thông tin (dữ liệu) ứng với thứ tự đó.
Hình thức cơ bản cho việc khai báo mảng một chiều là :
<scope> <var_name>[<size>]

• <scope> : cho biết đây là biến Local, Global hay Dim

• <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"

Vị trí 0 1 2 ··· 100


Dữ liệu Ant Bird Cat ··· ··· 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ụ :

$animal = $List[2] ; $animal sẽ chứa chuỗi "Cat"

Biên soạn : Đỗ Minh Tuân Trang 14 Tác giả: Lê Quốc Lường


3.5. MẢNG Chương 3. Tham khảo ngôn ngữ

3.5.3 MẢNG HAI CHIỀU (MA TRẬN)


Một mảng hai chiều chính là một ma trận được tạo thành bởi hàng và cột. Nếu bạn đã biết qua
Excel thì bảng tính trong Excel chính là một ma trận. Hình thức chung cho việc khai báo mảng hai
chiều cũng tương tự như mảng một chiều, nhưng có thêm việc khai báo chỉ mục thứ hai. Trong mảng
hai chiều, chỉ mục thứ nhất cho biết hàng và chỉ mục thứ hai là cột.. Cụ thể là :
<scope> <var_name> [<size_row>][<size_column>]
Trong đó :

• <scope> cũng dùng để chỉ định phạm vi

• <var_name> chỉ định tên mảng

• <size_row> chỉ định số dòng tối đa

• <size_column> chỉ định số cột tối đa

Ví dụ :

Dim $matrix[2][3] ; tạo một ma trận có 2 dòng và 3 cột


$matrix[0][0] = 2
$matrix[0][1] = 4
$matrix[0][2] = 6
$matrix[1][0] = 1
$matrix[1][1] = 3
$matrix[1][2] = 5

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

3.5.4 CÁC VẤN ĐỀ LIÊN QUAN


Vấn đề 1 : Khởi tạo giá trị cho mảng
Khi khai báo một mảng bạn cũng có thể khởi tạo giá trị cho các phần tử bên trong mảng. Các giá
trị khi khởi tạo cho mảng phải được nằm trong cặp dấu ngoặc vuông [ ], và mỗi giá trị phải được
ngăn cách bởi dấu phẩy. Đối với mảng hai chiều thì cần thêm một cặp dấu ngoặc vuông khác để rào
các giá trị có cùng chỉ mục dòng. Ví dụ :

Dim $array[5] = [10, 20, 30, 40, 50]


Local $test[4] = ["a", "Hello", 500, 4.55]
Global $Grid[2][3] = [["sun", "moon", "earth"], [1000, cos(0), sqrt(900)]]

Vấn đề 2 : Lấy tổng số phần tử hiện có trong mảng


Sẽ có không ít tình huống bạn tiếp nhận và xử lý một mảng có nhiều phần tử bên trong. Tuy nhiên
có một rắc rối là bạn không biết mảng này hiện đang có bao nhiêu phần tử, vì nó thay đổi theo chu
kỳ hay một lý do nào đó. Với trường hợp này, sử dụng hàm UBound là một lời giải vì nó sẽ cho biết
một mảng được chỉ định có bao nhiêu phần tử. Cú pháp như sau :

UBound( $array, $dimension)

Biên soạn : Đỗ Minh Tuân Trang 15 Tác giả: Lê Quốc Lường


3.5. MẢNG Chương 3. Tham khảo ngôn ngữ

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ụ :

Dim $myArray[10][20] ;element 0,0 to 9,19


$rows = UBound($myArray) ; lấy chiều thứ nhất
$cols = UBound($myArray, 2) ; lấy chiều thứ hai
$dims = UBound($myArray, 0) ; lấy số chiều của mảng
$info = "This Array has " & $dims &" dimension(s) : " &@CRLF & _
$rows & " rows, " & $cols & " columns"
MsgBox(0, "Msg of Array", $info)

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.

Vấn đề 3 : Thiết lập lại kích thước của một mảng


Theo qui định, nếu muốn sử dụng một biến mảng thì trước đó phải khai báo tên, số chiều và kích
thước tối đa để chứa các phần tử. Trong trường hợp bạn muốn định lại kích thước cho mảng đó (tăng
hoặc giảm kích thước) thì việc bạn cần làm là sử dụng từ khóa ReDim . Cú pháp chung :

ReDim $array [new index 1] ... [new index n]

$array : là tên của mảng cần định lại kích thước


New index : kích thước mới cho tổng số phần tử đối đa sẽ có trong mảng. [new index n] áp dụng
cho chiều thứ n của mảng.
Bạn xem ví dụ sau để hiểu rõ hơn cách thức làm việc. Đoạn mã bên dưới sẽ minh họa việc thiết
lập lại kích thước tối đa cho mảng một chiều.

; khai báo kích thước ban đầu


Dim $a[5] = [2, 4, 6, 8, 10]
ConsoleWrite("Before : ")
For $i=0 to UBound($a)-1
ConsoleWrite($a[$i] & " ")
Next
; Định lại kích thước mảng
ReDim $a[3]
ConsoleWrite(@crlf & "After rediming : " )
For $i=0 To 2
ConsoleWrite($a[$i] & " ")
Next

Đầ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.

Biên soạn : Đỗ Minh Tuân Trang 16 Tác giả: Lê Quốc Lường


3.6. MARCO Chương 3. Tham khảo ngôn ngữ

Vấn đề 4 : Các chú ý


+ Chỉ mục của mảng có thể là một biến hoặc một biểu thức, sao cho nó trả về một chỉ mục hợp
lệ. Vì thế bạn có thể làm nhiều cách khác nhau để truy xuất đến các phần tử bên trong mảng. Cũng
xin nhắc lại rằng, tất cả các mảng đều có 0 làm chỉ mục cho phần tử thứ nhất.
Ví dụ sau minh họa cho việc khởi tạo các giá trị ngẫu nhiên cho mảng một và hai chiều.

; khởi tạo và in giá trị cho mảng một chiều


Dim $a[10]
ConsoleWrite("---- A list : "& @crlf)
For $i=0 To 9
$a[$i] = Int(Random(0, 100))
ConsoleWrite($a[$i] & " ")
Next
; khởi tạo và in giá trị cho mảng hai chiều
Dim $m [4] [5]
ConsoleWrite(@crlf & "---- A matrix : " & @crlf)
For $i=0 To 3
For $j=0 to 4
$m[$i][$j] = Int(Random(0,10))
ConsoleWrite($m[$i][$j] & " ")
Next
ConsoleWrite(@crlf)
Next

+ 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
.

3.6.1 Macro thời gian

@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

Biên soạn : Đỗ Minh Tuân Trang 17 Tác giả: Lê Quốc Lường


3.6. MARCO Chương 3. Tham khảo ngôn ngữ

@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)

3.6.2 Macro thư mục

Á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")

3.6.3 Macro hệ thống

@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

Biên soạn : Đỗ Minh Tuân Trang 18 Tác giả: Lê Quốc Lường


3.6. MARCO Chương 3. Tham khảo ngôn ngữ

@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)

3.6.4 Macro liên quan đến AutoIt


Phần này chỉ trình bày một số Macro thông dụng. Các macro còn lại các bạn tự xem.

@compiled Trả về 1 nếu mã đã được biên dịch, ngược lại trả về 0


@error Cờ biểu thị trạng thái lỗi. Xem hàm SetError
@exitCode Mã thoát được thiết lập bởi lệnh Exit
@exitMethod Xem Func OnAutoItExit()
@extended Một giá trị mở rộng được trả về từ một hàm. Xem hàm StringReplace
@NumParams Tổng số thông số đã sử dụng trong việc gọi hàm của người dùng..
@ScriptName Tên của file script đang chạy
Đường dẫn đến thư mục chứa file script đang chạy. (không chứa dấu
@ScriptDir
"\" ở cuối )
@ScriptFullPath Bằng với @ScriptDir & "\" & @ScriptName
@ScriptLineNumber Số thứ tự của dòng lệnh đang được thi hành. Thích hợp cho việc debug.
@WorkingDir Thư mục làm việc hiện tại (không chứa dấu "\" ở cuối)
Đường dẫn và tên của file AutoIt đang chạy. Nếu là mã đã biên dịch
@AutoItExe
thì trả về đường dẫn và tên của file exe đang chạy
@AutoItPID ID của đoạn chương trình script đang chạy trong bộ nhớ
@AutoItVersion Số phiên bản của AutoIt như 3.0.102.0
@AutoItX64 Trả về 1 nếu đang chạy dưới AutoIT phiên bản x64
@InetGetActive Là 1 nếu một InetGet download đã được kích hoạt, ngược lại là 0.
Suốt quá trình InetGet download, macro này cho số byte đã đọc. Cho
@InetGetBytesRead
-1 nếu có một lỗi download.
@CR Phím xuống dòng, Chr(13); đôi lúc hữu dụng cho các ngắt dòng
@LF Tín hiệu xuống dòng, Chr(10); đặc trưng cho việc ngắt dòng
@CRLF = @CR & @LF ; đôi lúc hữu dụng cho các ngắt dòng
@TAB Phím Tab, Chr(9)

Biên soạn : Đỗ Minh Tuân Trang 19 Tác giả: Lê Quốc Lường


Chương 4

Câu lệnh điều kiện

4.1 Câu lệnh điều kiện If


Câu lệnh if là một câu lệnh điều kiện phổ biến nhất trong các ngôn ngữ lập trình bậc cao. Nó được
dùng để kiểm tra một điều kiện nào đó, nếu dúng thì thực hiện công việc tương ứng, ngược lại thì
làm một việc khác. Nếu bạn đã học qua Excel thì chắc chắn phải biết hàm If bên đó. Với AutoIt,
câu lệnh điều kiện if được thành lập thành một khối. Để đơn giản, ta chia thành các phần nhỏ để dễ
trình bày.

4.1.1 Dạng chung của If


If <điều kiện> Then
<các câu lệnh>
............
Else
<các câu lệnh>
.........
EndIf

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

4.1.2 Các If lồng nhau


If được lồng nhau là một If nằm bên trong một khối If...EndIf khác. Các If lồng nhau được dùng
rất phổ biến trong lập trình, thông thường là trong trường hợp thẩm định một <điều kiện> với nhiều
giả thiết xảy ra khác nhau. Trong các If lồng nhau thì lệnh Else luôn có mối quan hệ liên kết với khối
If (chưa có EndIf ) nằm gần nó nhất.
Ví dụ sau là một bổ sung của ví dụ phía trên, xét xem thêm điều kiện để biết số đó có phải là số
có 3 chữ số hay không.

$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

4.1.3 Bước thang If... ElseIf... Else... EndIf


Với hai phần vừa được trình bày ở trên thì có lẻ bạn đã hiểu được phần nào khối lệnh If và có thể
sử dụng nó để giải quyết nhiều bài toán có yêu cầu điều kiện. Trong phần các khối If lồng nhau, chỗ
lồi lõm là một kỹ thuật đúng. Tuy nhiên, khi có quá nhiều If được lồng vào nhau thì đoạn mã của
bạn sẽ bị lõm vào rất sâu. Vì lý do này mà bước thang If..ElseIf... được dùng. ElseIf là một từ khóa
của AutoIt, báo hiệu việc thẩm định điều kiện If tiếp theo. Cú pháp :

If <điều kiện 1> Then


<các câu lệnh 1>
.........
ElseIf <điều kiện 2> Then
<các câu lệnh 2>
..........
ElseIf <điều kiện n> Then
<các câu lệnh n>
...........
Else
<các câu lệnh>
........
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

Biên soạn : Đỗ Minh Tuân Trang 21 Tác giả: Lê Quốc Lường


4.2. CÂU LỆNH ĐIỀU KIỆN SELECT Chương 4. Câu lệnh điều kiện

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 :

Dim $a=0, $b =2, $c=0


if ($a>0 And $b>0) Or $c=0 Then MsgBox(0,"msg", " Thông điệp 1")
if $a>0 And ($b>0 Or $c=0) Then MsgBox(0,"msg", " Thông điệp 2")

4.2 CÂU LỆNH ĐIỀU KIỆN SELECT


Khối lệnh Select thực chất là một dạng khác của If lồng nhau, được dùng như một dạng trình bày
có hiệu quả hơn trong việc thẩm định nhiều điều kiện liên tiếp. Dạng tổng quát của Select như sau :
Select
Case <điều kiện 1>
<các câu lệnh>
......
Case <điều kiện 2>
<các câu lệnh>
........
Case Else
<các câu lệnh>
........
EndSelect

Biên soạn : Đỗ Minh Tuân Trang 22 Tác giả: Lê Quốc Lường


4.3. CÂU LỆNH SWITCH Chương 4. Câu lệnh điều kiện

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:

; đoạn mã này cho biết hệ điều hành đang sử dụng


$ver = @OSVersion
Select
Case $ver = "WIN_2008"
MsgBox(0,"Version", "Your OS is Win 2008")
case $ver = "WIN_VISTA"
MsgBox(0,"Version", "Your OS is Win Vista")
Case $ver = "WIN_2003"
MsgBox(0,"Version", "Your OS is Win 2003")
Case $ver = "WIN_XP"
MsgBox(0,"Version", "Your OS is Win XP")
Case $ver ="WIN_2000"
MsgBox(0,"Version", "Your OS is Win 2000")
case Else
MsgBox(0,"Version", "Your OS is Win 9x")
EndSelect

4.3 CÂU LỆNH SWITCH


Không giống như khối lệnh If hay Select thực hiện thẩm định nhiều điều kiện của bài toán. Trong
khối lệnh Switch, ứng với một biến cho phép bạn lựa chọn nhiều giá trị hoặc là miền giá trị để làm
điều kiện xử lý. Vì vậy mà Switch còn được gọi là lệnh lựa chọn đa nhánh. Thực chất việc xét từng
giá trị cho một biến vẫn có thể làm được với hai khối lệnh If hay Select , nhưng ở Switch cách thức
làm việc đã được đơn giản để có thể thực hiện nhanh chóng và dễ hiểu hơn.

4.3.1 Cú pháp tổng quát


Switch <biến hoặc biểu thức>

Biên soạn : Đỗ Minh Tuân Trang 23 Tác giả: Lê Quốc Lường


4.4. CONTINUECASE Chương 4. Câu lệnh điều kiện

Case <value1> To <Value2> , < value3> To <value4> , .....,


<value n-1> To <value n>
<các câu lệnh>
.......
Case <value1> To <Value2> , < value3> To <value4> , .....,
<value n-1> To <value n>
<các câu lệnh>
........
Case Else
<các câu lệnh>
.......
EndSwitch

4.3.2 Giải thích


Giá trị của <biến hoặc biểu thức> sẽ được lấy và kiểm tra lần lượt theo thứ tự các Case. Khi một
giá trị trong Case phù hợp giá trị của <biến hoặc biểu thức> thì các dãy lệnh liên hợp với Case đó
được thi hành. Các Case lần lượt được duyệt cho đến khi gặp một Case thỏa điều kiện hoặc từ khóa
EndSwitch cùng cấp. Nếu Case Else được chỉ định, thì khi tất cả các Case đều không thỏa, khối lệnh
liên kết với Case Else sẽ được thực thi.

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.

Biên soạn : Đỗ Minh Tuân Trang 24 Tác giả: Lê Quốc Lường


4.4. CONTINUECASE Chương 4. Câu lệnh điều kiện

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.

Biên soạn : Đỗ Minh Tuân Trang 25 Tác giả: Lê Quốc Lường


Chương 5

Vòng lặp

5.1 VÒNG LẶP FOR


Trong AutoIt và tất cả các ngôn ngữ lập trình hiện đại khác, các lệnh lặp (cũng còn được gọi là
vòng lặp) cho phép thực hiện lặp đi lặp lại cho đến khi một điều kiện nào đó xảy ra. Tùy theo ngôn
ngữ và tùy loại vòng lặp mà cách diễn đạt điều kiện sẽ khác nhau. Thông thường vòng lặp For là
vòng lặp cơ bản, cho phép thực hiện lặp lại với số lần định trước.
AutoIt hỗ trợ vòng lặp For với dạng tổng quát sau :

For <var> = <start{\_}value> To <stop{\_}value> Step <step{\_}value>


<các câu lệnh>
.........
Next

5.1.1 Giải thích


<var> : biến dùng để thực hiện việc đếm
<start_value> : giá trị bắt đầu cho biến đếm
<stop_value > : giá trị cuối cùng cho biến đếm
<step_value> : giá trị cộng vào cho biến đếm sau mỗi lần lặp. Mặc định là 1.
<các câu lệnh> : công việc cần xử lý. Vẫn có thể là For hay những vòng lặp khác đều được.
Vòng lặp For được bắt đầu bởi từ khóa For và kết thúc bởi từ khóa Next. Đầu tiên, <start_value>
sẽ được gán vào biến đếm <var> , sau đó so sánh với <stop_value>. Nếu <var> nhỏ hơn hoặc bằng
<stop_value> thì thực hiện <các câu lệnh> , sau đó biến đếm <var> sẽ được tăng lên <step_value>
đơn vị. Tiếp tục so sánh với <stop_value> , thực hiện <các câu lệnh> rồi sau đó tăng biến đếm lên
<step_value> . Quá trình lặp lại cho đến khi biến đếm <var> lớn hơn <stop_value>, vòng lặp kết
thúc.
Miêu tả cụ thể đối với vòng lặp For như trình bày ở trên xem ra có vẻ dài dòng. Bạn chỉ cần hiểu
đơn giản là, vòng lặp For sẽ cho biến đếm <var> chạy từ <start_value> đến <stop_value>, mỗi
lần lặp thì cộng <step_value> vào <var>.

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.

For $i=1 to 100


ConsoleWrite($i & " ")
Next
MsgBox(0, "Thong bao", " Vòng lặp kết thúc ")

Đ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

For $i=100 to 0 step -2


ConsoleWrite($i & " ")
Next
MsgBox(0, "Thong bao", " Vòng lặp kết thúc ")

5.2 VÒNG LẶP WHILE ... WEND


Nếu như vòng lặp For thực hiện việc lặp với một biến chạy thì vòng lặp While thực hiện việc lặp
bằng việc kiểm tra điều kiện.

5.2.1 Cú pháp chung


While <điều kiện>
<các câu lệnh>
......
WEnd

5.2.2 Giải thích


<điều kiện> có thể là một một biểu thức điều kiện và True là giá trị khác 0
<các câu lệnh > có thể là rỗng, lệnh đơn, khối lệnh hoặc là các vòng lặp khác.
Trước khi các lệnh bên trong vòng lặp được thực thi, thì <điều kiện> được kiểm tra. Nếu trả về
giá trị True, thì <các câu lệnh> được duyệt và thi hành cho đến khi gặp WEnd. Khi đó vòng lặp
quay lại thẩm định <điều kiện>. Quá trình lặp kết thúc khi <điều kiện> trả về False (tức không
còn đúng nữa).

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.

Biên soạn : Đỗ Minh Tuân Trang 27 Tác giả: Lê Quốc Lường


5.3. VÒNG LẶP DO... UNTIL Chương 5. Vòng lặp

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 VÒNG LẶP DO... UNTIL


Tương tự như While... WEnd, khối lệnh Do ... Until cũng thực hiện việc lặp dựa trên việc kiểm tra
biểu thức điều kiện.

5.3.1 Cú pháp
Do
<các câu lệnh>
........
Until <điều kiện>

5.3.2 Giải thích


Vòng lặp Do.. Until thực hiện việc lặp lại các lệnh bên trong nó khi <điều kiện> trả về giá trị
False. Có nghĩa là vòng lặp sẽ kết thúc nếu như <điều kiện> là đúng (True).

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 FOR ... IN... NEXT


Chức năng của câu lệnh này là liệt kê các phần tử bên trong một mảng hoặc một tập hợp object
(đối tượng) COM (component object model)

Biên soạn : Đỗ Minh Tuân Trang 28 Tác giả: Lê Quốc Lường


5.4. FOR ... IN... NEXT Chương 5. Vòng lặp

5.4.1 Cú pháp
For <var> In <expression>
<các câu lệnh>
........
Next

5.4.2 Giải thích


<var> : biến sẽ được gán giá trị của từng phần tử trong <expression>
<expression> : một đối tượng COM hoặc một mảng có ít nhất một phần tử.

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.

• Vòng lặp For...In cho phép lồng vào nhau.

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

Biên soạn : Đỗ Minh Tuân Trang 29 Tác giả: Lê Quốc Lường


5.5. WITH... ENDWITH Chương 5. Vòng lặp

5.5 WITH... ENDWITH


Trên thực tế câu lệnh With..EndWith không hề có chức năng của một vòng lặp, nhưng do file Help
của AutoIt xếp nó vào phạm trù của một vòng lặp nên ở đây ta vẫn xem xét nó. Chức năng chính
của câu lệnh này là đơn giản hóa việc tham chiếu đến các biến kiểu Object có tên dài.

5.5.1 Cú pháp
With <biểu thức>
<các câu lệnh>
.......
EndWith

5.5.2 Giải thích


<biểu thức> : là một biểu thức có kiểu Object
<các câu lệnh> : thao tác trên các biến được tham chiếu đến

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

; đoạn mã này sử dụng object theo kiểu thông thường


$object = ObjCreate("InternetExplorer.Application.1")
$object.Visible = 1
$object.Height = 768
$object.Width = 1024
$object.Navigate("http://www.google.com/")
; đoạn mã này sử dụng object với With.. EndWith để đơn giản mã lệnh
$object = ObjCreate("InternetExplorer.Application.1")
With $object
.Visible = 1
.Height = 768
.Width = 1024
.Navigate("http://www.google.com/")
EndWith

5.6 VÒNG LẶP VÔ TẬN


Trong lập trình, sẽ có không ít tình huống bạn cần xử lý một bài toán, mà giải thuật bạn cần dùng
là một vòng lặp không biết trước số lần lặp. Vì vậy, cách giải quyết là dùng một vòng lặp vô tận.
Thông thường trên windows, cách sử dụng phổ biến nhất của vòng lặp vô tận là dùng để xử lý giao
diện người dùng GUI và các tương tác trên GUI, phần này được đề cập rõ trong phần tạo giao diện
bằng AutoIt (Tham chiếu GUI) của ebook này.
Để tạo một vòng lặp vô tận cho For, While hay Do thì nguyên tắc chung là làm cho <điều kiện>
của vòng lặp đó luôn luôn thỏa. Cụ thể là :

Biên soạn : Đỗ Minh Tuân Trang 30 Tác giả: Lê Quốc Lường


5.7. EXITLOOP Chương 5. Vòng lặp

For $i = 0 To 0 Step 0 While 1 Do


<lệnh> <lệnh> <lệnh>
..... ..... ....
Next WEnd Until 0

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 đủ :

ExitLoop [which loop]

5.7.1 Giải thích


Tham số [which loop] là tùy chọn, có thể có hoặc không. Nếu không được chỉ định thì mặc định
là 1. Chức năng của tham số này cho phép chỉ định vòng lặp nào cần phải ngắt trong trường hợp có
nhiều vòng lặp lồng nhau. Nếu có nhiều vòng lặp lồng nhau, thì vòng lặp chứa lệnh ExitLoop là vòng
lặp cấp 1 (vòng lặp hiện hành), vòng lặp bao bên ngoài vòng lặp cấp 1 là vòng lặp cấp 2, bao bên
ngoài vòng lặp cấp 2 là vòng lặp cấp 3,... Vì vậy nếu [which loop]
= 1 tương ứng với vòng lặp cấp 1 (vòng lặp hiện hành)
= 2 tương ứng với vòng lặp cấp 2
= n tương ứng với vòng lặp cấp n
= 0 hoặc một số âm thì ExitLoop không có tác dụng ngắt.

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)

Biên soạn : Đỗ Minh Tuân Trang 31 Tác giả: Lê Quốc Lường


5.8. CONTINUELOOP Chương 5. Vòng lặp

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 đủ

ContinueLoop [which loop]

5.8.1 Giải thích


Tham số [which loop] của ContinueLoop hoàn toàn như ExitLoop. Cũng có thể có hoặc không (mặc
định là 1 - tức vòng lặp hiện hành). [which loop] bằng n, thì áp dụng cho vòng lặp cấp n. [which loop]
bằng 0 hoặc số âm thì ContinueLoop cũng mất tác dụng.
Đối với vòng lăp For, ContinueLoop gây ra việc tăng giá trị của biến đếm, thực hiện so sánh với
giá trị dừng và chạy các lệnh như bình thường.
Đối với vòng lặp While và Do, ContinueLoop cũng bỏ qua các lệnh phía sau nó và quay trở ra xét
điều kiện của vòng lặp.

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.

Biên soạn : Đỗ Minh Tuân Trang 32 Tác giả: Lê Quốc Lường


5.8. CONTINUELOOP Chương 5. Vòng lặp

For $i=1 To 4
If $i=2 Then ContinueLoop
MsgBox(0, "message", "$i = " & $i)
Next

Biên soạn : Đỗ Minh Tuân Trang 33 Tác giả: Lê Quốc Lường


Chương 6

Hàm người dùng

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.

6.2 Phạm vi của một hàm


Trong AutoIt, mỗi hàm là một khối mã riêng biệt. Mã của một hàm chỉ thuộc riêng hàm đó và các
câu lệnh trong bất cứ một hàm nào khác đều không thể truy cập đến nó được. Nói theo cách khác,
các mã và dữ liệu được định nghĩa bên trong một hàm thì không thể tác động, ảnh hưởng đến các
mã hay dữ liệu được định nghĩa bên trong một hàm khác, vì hai hàm có hai phạm vi khác nhau.

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 ĐỊNH NGHĨA HÀM


Để định nghĩa một hàm, bạn phải tuân thủ các qui tắc mà ngôn ngữ lập trình đó hỗ trợ. Với AutoIt,
dạng tổng quát để khai báo và định nghĩa một hàm như sau :

Func <tên_hàm>( <các tham biến> )


<các lệnh nội bộ>
. . . . .
Return <giá trị>
EndFunc

6.3.1 Giải thích


Func. . . EndFunc : là hai từ khóa bắt buộc, có nhiệm vụ chỉ ra điểm bắt đầu và kết thúc của một
hàm
<tên_hàm> : tên đại diện miêu tả ngắn gọn chức năng của hàm
<các tham biến> : khai báo một danh sách tên các biến, mỗi biến được ngăn cách với nhau bằng
dấu phẩy. Danh sách này sẽ nhận các dữ kiện được truyền vào để hàm xử lý. Một hàm có thể không
có <các tham biến>, tức danh sách tham biến sẽ rỗng. Tuy thế, ngay cả khi không có tham biến nào
thì bạn vẫn phải đặt dấu ngoặc đơn vào.
<các lệnh nội bộ> : ở đây bạn chính là thân của hàm. Bạn có thể thực hiện việc khai báo các biến
cục bộ (Local), viết các biểu thức , . . . .
Return <giá trị> : tùy chọn, có thể có hoặc không. Nếu như bạn tạo một hàm có trả về một giá
trị thì phần này được thêm vào, ngược lại thì không cần. Ví dụ như bạn định nghĩa hàm Sin(x) để
tính sin của x, thì khi thực hiện các tính toán xong. Bạn dùng lệnh Return <giá trị> để trả về kết
quả vừa tính được cho Sin(x).

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

Biên soạn : Đỗ Minh Tuân Trang 35 Tác giả: Lê Quốc Lường


6.4. TRUYỀN DỮ KIỆN CHO HÀM Chương 6. Hàm người dùng

$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

6.4 TRUYỀN DỮ KIỆN CHO HÀM


Đầu tiên ta có vài khái niệm cần nhắc lại :

• 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)

Biên soạn : Đỗ Minh Tuân Trang 36 Tác giả: Lê Quốc Lường


6.5. CÁC THƯ VIỆN TRONG AUTOIT Chương 6. Hàm người dùng

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

6.4.4 CÁC CHÚ Ý


• Việc sử dụng cách truyền bằng trị, bằng tham chiếu hay tất cả những gì được nêu trong phần
này thì tùy vào trường hợp mà ta dùng. Không nhất thiết là phải viết hết khi định nghĩa một
hàm

• Để 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.

6.5 Các thư viện trong AutoIt

Biên soạn : Đỗ Minh Tuân Trang 37 Tác giả: Lê Quốc Lường


6.6. CÁC HÀM MÔI TRƯỜNG THÔNG DỤNG Chương 6. Hàm người dùng

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

6.6 CÁC HÀM MÔI TRƯỜNG THÔNG DỤNG


Do số lượng các hàm trong AutoIt hiện nay rất lớn (trên 2200 hàm), nên phần này không trình bày
tất cả các hàm mà chỉ nói sơ bộ chức năng của một số hàm thông dụng liên quan đến môi trường

Biên soạn : Đỗ Minh Tuân Trang 38 Tác giả: Lê Quốc Lường


6.6. CÁC HÀM MÔI TRƯỜNG THÔNG DỤNG Chương 6. Hàm người dùng

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")

6.6.1 Quản lý môi trường


1. ClipGet( )
Lấy văn bản từ clipboard
Th. Công : trả về một chuỗi chứa đoạn text trong clipboard
Hỏng : gán \verb@|error = 1| nếu clipboard rỗng
= 2 nếu chứa mục nhập không phải là text
= 3 hoặc 4 nếu không thể truy cập clipboard
Chú ý : nếu có nhiều file/thư mục được lưu trong clipboard, thì đường dẫn và tên file/thư mục
được trả về, mỗi tên được ngăn cách bởi ký tự \verb@|LF|

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

Biên soạn : Đỗ Minh Tuân Trang 39 Tác giả: Lê Quốc Lường


6.6. CÁC HÀM MÔI TRƯỜNG THÔNG DỤNG Chương 6. Hàm người dùng

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)

6.6.2 Quản lý thư mục


1. DirCopy( “nguồn”, “đích” [, flag])
Copy một thư mục và tất cả các file, các thư mục con bên trong thư mục nguồn đến thư mục đích
“nguồn” : chỉ định thư mục cần copy (không có dấu \ ở cuối)
“đích” : thư mục sẽ chứa các phần được sao chép đến (không chứa dấu \ ở cuối)
flag : (tùy chọn) nếu flag = 0 thì không viết đè các file đã có ở thư mục đích (mặc định)
= 1 sẽ viết đè các file đã có

2. DirMove( “nguồn”, “đích” [,flag])


Dời một thư mục được chỉ định trong “nguồn” sang thư mục được chỉ định trong “đích”

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

4. DirRemove( “path” [, DelAll])


Xóa một thư mục
Path : đường dẫn của thư mục cần xóa
DelAll : = 0 (mặc định) không xóa các file và thư mục con bên trong
= 1 sẽ xóa tất cả các file và thư mục con bên trong (giống như lệnh DelTree trong DOS)

5. DirGetSize( “path” [,flag])


Trả về kích thước (tính theo byte) của thư mục chỉ định
Path : thư mục cần lấy kích thước. ví dụ : “c:\windows”
Flag : [tùy chọn] trả về kết quả mở rộng hay không
= 0 (mặc định) không trả về kết quả mở rộng

Biên soạn : Đỗ Minh Tuân Trang 40 Tác giả: Lê Quốc Lường


6.6. CÁC HÀM MÔI TRƯỜNG THÔNG DỤNG Chương 6. Hàm người dùng

= 1 trả về một mảng có nội dung sau :


$array[0] = Size
$array[1] = Tổng số file tìm thấy
$array[2] = Tổng số thư mục tìm thấy
= 2 không lấy kích thước của các file trong thư mục con
Th. Công : trả về kích thước của thư mục (>=0)
Hỏng : trả về -1 và gán @error =1 nếu đường dẫn không tồn tại

6.6.3 Quản lý tập tin


1. FileCopy( “nguồn”, “đích” [,flag])
Sao chép một hoặc nhiều file từ thư mục “nguồn” sang thư mục “đích”
“nguồn” : đường dẫn chứa các file cần copy
“đích” : thư mục sẽ chứa các file được sao chép đến
Flag : [tùy chọn] nếu flag
= 0 (mặc định) không viết đè các file trùng tên
= 1 viết đè các file trùng tên trong thư mục “đích”
= 8 tự tạo cấu trúc thư mục “đích” nếu như đích đến không tồn tại.
Th. Công : trả về 1
Hỏng : trả về 0
Chú ý : nếu bạn gán flag = 9, thì tương đương (1+8). Giá trị này báo cho biết rằng sẽ viết đè nếu
có file trùng tên và tự tạo cấu trúc thư mục đích đến. Muốn sao chép nhiều file, ta sử dụng ký tự
* để làm giá trị tùy ý. Ví dụ : *.mp3 để chọn tất cả file mp3.

2. FileMove( “file_nguồn” , “nơi đến” [, flag])


Di chuyển một hoặc nhiều file sang thư mục khác
File_nguồn : đường dẫn và tên tập tin cần dời đi
Nơi đến : đường dẫn để chứa các file cần dời đi. Nếu tham số này nêu ra một tên tập tin khác, thì
file_nguồn sau khi dời đến thư mục chỉ định sẽ bị đổi tên.
Flag : giống như lệnh FileCopy
Th. Công : trả về 1
Hỏng : trả về 0
Chú ý : nếu đường dẫn chứa file nguồn và nơi đến không cùng phân vùng, thì một tác vụ copy và
một tác vụ xóa được thực hiện.

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.

Biên soạn : Đỗ Minh Tuân Trang 41 Tác giả: Lê Quốc Lường


6.6. CÁC HÀM MÔI TRƯỜNG THÔNG DỤNG Chương 6. Hàm người dùng

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”

5. FileRecycleEmpty( [“ổ đĩa”])


Làm rỗng thùng rác
[ổ đĩa] : tham số này tùy chọn, cho biết cần đổ thùng rác ở ổ đĩa nào. Nếu bỏ qua sẽ đổ bỏ ở tất
cả ổ đĩa.
Th. Công : trả về 1
Hỏng : trả về 0
Chú ý : để hàm này làm việc máy bạn phải IE từ phiên bản 4 trở lê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

8. FileInstall( “source”, “dest” [, flag])


Bao gồm và cài đặt một file với đoạn mã đã biên dịch
Source : đường dẫn nguồn của những file cần dịch. Đường dẫn này phải là một chuỗi rõ ràng,
không được phép là một biến. Có thể sử dụng đường dẫn liên quan như .\ hoặc ..\
Dest : đường dẫn đích đến của các file cần extract. Nếu muốn chỉ định một thư mục thì dùng dấu
\ ở cuỗi. Cho phép dest là biến số
Flag : cho biết có chép đè khi gặp file trùng tên hay không.
= 0 (mặc định) : không viết đè
= 1 : viết đè
Chú ý : hàm này được thiế kế là để gom các file vào trong một đoạn mã đã biên dịch. Những file
được gom vào có thể được extract (xả nén) trong quá trình chạy của file script đã biên dịch và
lệnh này được thực thi. Bạn có thể hình dung là nếu bạn đưa một file ảnh vào trong file script thì
kích thước của file script sau khi biên dịch sẽ tăng lên. Một điều nữa là các thông tin gốc về thời
gian tạo, chỉnh sửa cũng sẽ được giữ lại khi cài đặt

Biên soạn : Đỗ Minh Tuân Trang 42 Tác giả: Lê Quốc Lường


6.6. CÁC HÀM MÔI TRƯỜNG THÔNG DỤNG Chương 6. Hàm người dùng

9. FileOpenDialog ( "title", "init dir", "filter" [, options [, "def name" [, hwnd]]] )


Gọi hộp thoại Open File (hộp thoại xuất hiện khi bạn chọn lệnh File>Open.. trong các ứng dụng)
Title : tiêu đề của hộp thoại khi xuất hiện
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ở. ví dụ như : “All (*.*)” hoặc “Text files (*.txt)”
hoặc “All (*.*) | Text files (*.txt)”
Options : [tùy chọn] cho phép mở rộng một vài điều kiện, sử dụng giá trị sau :
1 = file phải tồn tại (nếu người dùng gõ tên file)
2 = đường dẫn phải tồn tại (nếu gõ đường dẫn)
4 = cho phép chọn nhiều file
8 = nhắc nhở tạo file mới nếu file không tồn tại
Def name : tên đề nghị cho người 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 Open 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 “|”.
Bạn cũng có thể kết hợp các giá trị của Options lại với nhau để có nhiều lựa chọn. ví dụ : 1+4 để
vừa có lựa chọn là “file phải tồn tại” và “ cho phép chọn nhiều file”

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 :

Biên soạn : Đỗ Minh Tuân Trang 43 Tác giả: Lê Quốc Lường


6.6. CÁC HÀM MÔI TRƯỜNG THÔNG DỤNG Chương 6. Hàm người dùng

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ổ.

6.6.4 Quản lý ổ đĩa


1. DriveGetDrive( "type")
Liệt kê tất cả các ổ đĩa có trên hệ thống
Type : loại ổ đĩa cần tìm : "ALL", "CDROM", "REMOVABLE", "FIXED", "NETWORK",
"RAMDISK" hoặc "UNKNOWN"
Th. Công : trả về một mảng, mỗi phần tử là một chuỗi chứa ký tự ổ đĩa được tìm thấy (ví dụ như
C: ). Phần tử đầu tiên trong mảng (có chỉ mục 0) sẽ cho biết tổng số ổ đĩa được tìm thấy.
Hỏng : trả về chuỗi rỗng và gán @error = 1

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

4. DriveSetLabel( "path", "label")


Gán nhãn (tên) cho ổ đĩa
Path : ổ đĩa cần gán nhãn (như "c:\")
Label : nhãn mới để gán cho ổ đĩa (tối đa 11 ký tự)
Th. Công : trả về 1
Hỏng : trả về 0

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

Biên soạn : Đỗ Minh Tuân Trang 44 Tác giả: Lê Quốc Lường


6.6. CÁC HÀM MÔI TRƯỜNG THÔNG DỤNG Chương 6. Hàm người dùng

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

Biên soạn : Đỗ Minh Tuân Trang 45 Tác giả: Lê Quốc Lường


Chương 7

Giao diện đồ họa

7.1 Giới thiệu về GUI


GUI là từ viết tắt của Graphic User Interface – giao diện người dùng bằng đồ họa. Điều này có lẽ
không cần phải nóii nhiều vì bạn đã thấy nó ngay từ khi tiếp xúc với máy tính, chúng là các biểu
tượng, cửa sổ, nút bấm, ... . Cách đây vài chục năm, cái thời mà DOS còn ngự trị trên máy PC thì
có lẽ bạn sẽ gặp rắc rối khi phải nhớ và thao tác một cách chậm chạp với các câu lệnh dài dòng, lắm
cú pháp. Còn đến cái thời mà Windows bành trướng sức mạnh của mình bằng giao diện đồ họa và
các tính năng mới mẻ, thì việc bạn cần làm khi sử dụng máy tính là nhớ các thao tác. Tất cả các
lệnh và hướng dẫn đều có trên màn hình, bạn chỉ cần chọn và nhấn chuột hoặc phím. Thật là tuyệt
cho người sử dụng.
Còn đối với người lập trình thì sao ? Khi mới bắt đầu tiếp xúc với việc lập trình ứng dụng trong
windows , sẽ không ít người trong chúng ta ngán ngẫm . Tại sao? Đơn giản là vì nó có quá nhiều
hàm và cách tổ chức cấu trúc thì chẳng dễ nhớ tí nào. Nếu bạn đã từng học qua C/C++ thì bạn
sẽ hiểu cái cảm giác đó. Thế AutoIt sẽ giúp cho công việc của ta dễ dàng hơn à ? Xin thưa là đúng
như vậy. Mặc dù bên trong Windows đã được xây dựng sẵn một thư viện đồ sộ cho việc lập trình các
ứng dụng có giao diện , nhưng cú pháp của nó quả là rắc rối . Và chúng ta – những người sử dụng
AutoIt có thể khai thác thư viện này theo một cách đơn giản nhất mà AutoIt đã hỗ trợ. Sự hỗ trợ
mà AutoIt mang đến cho tôi và bạn chính là các hàm để tạo nên cửa sổ , các thành phần con trên
nó (ta gọi là các control ) và những thứ liên quan đã được thay thế với cú pháp ngắn gọn, đơn giản
và sáng sủa hơn.
Đến đây bạn có thể yên tâm rằng , học AutoIt sẽ không hề vô dụng. Tuy nhiên mọi thứ sẽ không
phải là màu hồng như bạn nghĩ vì bạn sẽ tốn khá nhiều thời gian để tìm hiểu về những gì AutoIt
đang có. Trước khi soạn tài liệu này , tôi đã phải tốn đến mấy tháng tìm hiểu một cách "lười biếng"
về ngôn ngữ này. Hy vọng rằng các bạn sẽ không phải tốn quá nhiều thời gian như tôi. Nói vòng vo
như thế cũng đủ rồi , bây giờ là nói vào nội dung chính.
Các control mà AutoIt hỗ trợ cho ta bao gồm :

• Label: Một mẫu văn bản đơn giản

• Button: Nút bấm

• Input : Vùng soạn thảo văn bản chỉ có một dòng

• Edit : Vùng soạn thảo văn bản có nhiều dòng

• 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

• Combo : Một danh sách có nút bấm để sổ xuống

46
7.1. GIỚI THIỆU VỀ GUI Chương 7. Giao diện đồ họa

• List : Một danh sách

• Date : Một hộp chọn ngày

• Pic : Vùng để hiển thị ảnh

• Icon : Vùng để hiển thị Icon

• Progress : Thanh tiến trình

• Tab : Một nhóm các control sẽ được chứa trong tab

• UpDown : Một control cho phép đính kèm cạnh bên control input

• Avi : Hiển thị đoạn clip AVI

• Menu : Menu chức năng trên cửa sổ

• 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í)

• TreeView : Một cây phân nhánh như trong Windows Explorer

• Slider : Một thanh trượt như thanh điều khiển âm lượng

• ListView : Control hiển thị thông tin của cột trong listview

• ListViewItem : Control hiển thị các mục trong listview

• Graphic : Control để hiển thị đồ họa được vẽ với hàm GUICtrlSetGraphic.

• Dummy : Control dummny (bù nhìn)


Đây là hình ảnh về các control mà ta có thể tạo lập được

Biên soạn : Đỗ Minh Tuân Trang 47 Tác giả: Lê Quốc Lường


7.2. TẠO GIAO DIỆN NGƯỜI DÙNG Chương 7. Giao diện đồ họa

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ổ.

Hàm Giải thích


GUICreate Tạo một cửa sổ
Tạo ra các control khác nhau trên cửa sổ (dấu . . . . sẽ được thay bằng tên
GUICtrlCreate...
cụ thể)
GUISetState Hiển thị hoặc ẩn cửa sổ
GUIGetMsg Lấy các thông tin về các sự kiện diễn ra trên gui
GUICtrlRead Đọc dữ liệu từ control
GUICtrlSetData Gán/Thay đổi dữ liệu trên control
GUICtrlSet... Thay đổi các lựa chọn trên control (ví dụ như màu sắc , style,. . . )

7.2 TẠO GIAO DIỆN NGƯỜI DÙNG


TẠO GIAO DIỆN NGƯỜI DÙNG
Phần này sẽ hướng dẫn bạn cách thức để tạo nên một ứng dụng có giao diện hẳn hoi. Một điều
quan trọng mà bạn cần nhớ là một ứng dụng trên windows không nhất thiết phải có giao diện (ví dụ
như các dịch vụ của win) và các thao tác xử lý đối với một ứng dụng trên Windows là tập trung vào
xử lý sự kiện xảy ra trên cửa sổ của ứng dụng đó. Ở đây, các bạn cần nắm được vài chú ý sau :

• 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 đó

7.2.1 Các tham số


Title : là tiêu đề của cửa sổ (văn bản này sẽ hiển thị trên thanh tiêu đề khi cửa sổ xuất hiện).
Width : độ rộng của cửa sổ (tính theo pixel)
Heigh : chiều cao của cửa sổ (tính theo pixel)
Left : vị trí bên trái của màn hình (tương ứng với tọa độ x). Gán -1 là canh giữa màn hình. Nếu
đã gán giá trị cho left, thì Top cũng phải được gán giá trị.
Top : vị trí phía trên của màn hình (tương ứng với tọa độ y). Gán -1 đề canh giữa màn hình

Biên soạn : Đỗ Minh Tuân Trang 48 Tác giả: Lê Quốc Lường


7.2. TẠO GIAO DIỆN NGƯỜI DÙNG Chương 7. Giao diện đồ họa

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>

Bảng các style mở rộng (Extended style table)

Style mở rộng Kết quả


Cho phép một control edit hoặc input được tạo trên GUI
có thể nhận được tên của file được kéo và thả vào. Con-
trol cũng phải được gán trạng thái $GUI_DROPACCEPTED
$WS_EX_ACCEPTFILES
bằng hàm GUICtrlSetState. Đối vớ các control khác, thông tin
của việc drag&drop có thể được truy lại với @GUI_DRAGID,
@GUI_DRAGFILE, @GUIDROPID.
$WS_EX_APPWINDOW Yêu cầu cửa sổ luôn nổi ở-trên thanh taskbar khi nó xuất hiện.
$WS_EX_CLIENTEDGE Cửa sổ sẽ được bao với viền bị trũng xuống (sunken).
Bao gồm một dấu chấm hỏi ở thanh tiêu đề của
$WS_EX_CONTEXTHELP cửa sổ. Không dùng được với WS_MAXIMIZEBOX hoặc
WS_MINIMIZEBOX.

Biên soạn : Đỗ Minh Tuân Trang 49 Tác giả: Lê Quốc Lường


7.2. TẠO GIAO DIỆN NGƯỜI DÙNG Chương 7. Giao diện đồ họa

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

Biên soạn : Đỗ Minh Tuân Trang 50 Tác giả: Lê Quốc Lường


7.3. CẬP NHẬT GUI Chương 7. Giao diện đồ họa

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 Cập nhật GUI


7.3.1 GUIDelete
Xóa bỏ một cửa sổ GUI và tất cả các control trên đó
GUIDelete ( [winhandle] )
Các tham số
Winhandle [tùy chọn] handle của cửa sổ cần xóa , được trả về từ hàm GUICreate (mặc định là
GUI đã dùng trước đó.)
Trả về
Th. Công : Returns 1.
Hỏng : Returns 0.

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)

Biên soạn : Đỗ Minh Tuân Trang 51 Tác giả: Lê Quốc Lường


7.3. CẬP NHẬT GUI Chương 7. Giao diện đồ họa

$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.

ID của sự kiện ID của control đã gởi đi sự kiện


0 Không có sự kiện
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_SECONDARYDOWN Nú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.

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

Biên soạn : Đỗ Minh Tuân Trang 52 Tác giả: Lê Quốc Lường


7.3. CẬP NHẬT GUI Chương 7. Giao diện đồ họa

$array[2] = handle của control đã tạo ra sự kiện (nếu có thể áp dụng)


$array[3] = tọa độ X hiện hành của con trỏ chuột (tính theo GUI)
$array[4] = tọa độ Y hiện hành của con trỏ chuột (tính theo GUI)
Nếu bạn sử dụng chế độ GUIOnEventMode thì
hàm GUIGetMsg luôn trả về 0 và @error được gán bằng 1.
Các nút minimize , restore và maximize sẽ không thực thi bất kỳ hành động gì
Chú ý

• 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 :

Biên soạn : Đỗ Minh Tuân Trang 53 Tác giả: Lê Quốc Lường


7.3. CẬP NHẬT GUI Chương 7. Giao diện đồ họa

Vị trí Tham số Ý nghĩa


1 hWnd Handle của GUI mà thông điệp sẽ xuất hiện
2 Msg Định danh (ID) của thông điệp Windows
3 wParam Tham số thông điệp đầu tiên (giá trị hex)
4 lParam Tham số thông điệp thứ hai (giá trị hex)

• 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.

Biên soạn : Đỗ Minh Tuân Trang 54 Tác giả: Lê Quốc Lường


7.3. CẬP NHẬT GUI Chương 7. Giao diện đồ họa

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ú ý:

• Size có thể là một số thập phân , như 8.5

• 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.

Biên soạn : Đỗ Minh Tuân Trang 55 Tác giả: Lê Quốc Lường


7.3. CẬP NHẬT GUI Chương 7. Giao diện đồ họa

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.

Giá trị trả về


Th. Công : Returns 1.
Hỏng : Returns 0.
Chú ý

• 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ố

Biên soạn : Đỗ Minh Tuân Trang 56 Tác giả: Lê Quốc Lường


7.4. TẠO CONTROL Chương 7. Giao diện đồ họa

[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 đó)

Giá trị trả về


Th. Công : Returns 1.
Hỏng : Returns 0.
Chú ý

• 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 đó)

Giá trị trả về


Th. Công : Returns 1.
Hỏng : Returns 0.
Chú ý
Sẽ không có sự kiểm tra nào trên giá trị của style , cũng không có sự tác động nào đối với các
control đã định nghĩa. Đó là trách nhiệm của người thiết kế để đảm bảo tính tương thích.

7.4 Tạo Control


7.4.1 GUICtrlCreateLabel
Label là chính là một text box, nó đảm nhiệm chức năng hiển thị nội dung của văn bản lên trên
GUI. Văn bản hiển thị trên đó là văn bản tĩnh, mà thông thường đối với C++ hay vài ngôn ngữ khác
người ta gọi là Static.
Để tạo một Label , ta có hàm với cú pháp sau :

Biên soạn : Đỗ Minh Tuân Trang 57 Tác giả: Lê Quốc Lường


7.4. TẠO CONTROL Chương 7. Giao diện đồ họa

GUICtrlCreateLabel ( "text", left, top [, width [, height [, style [, exStyle]]]] )


Các tham số

Text Văn bản sẽ hiển thị


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 trong GUI Control Styles Ap-
style
pendix.
default ( -1) : none. các style bắt buộc : $SS_NOTIFY, $SS_LEFT
exStyle [tùy chọn] định nghĩa style mở rộng cho control. Xem Extended Style Table.

Giá trị trả về


Th. Công : Trả về ID (định danh) của control Label vừa tạo
Hỏng : Trả về 0
Chú ý:
• Để thay đổi thông tin trên control, xem GUICtrlSet....

• Để 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

• Đưa về kích thước mặc định là $GUI_DOCKAUTO

• 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)

• Để thiết lập màu nền trong suốt, gọi GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT).


Ví dụ
#include <GUIConstantsEx.au3>
Opt(’MustDeclareVars’, 1)
Example()
Func Example()
Local $widthCell, $msg, $iOldOpt
; will create a dialog box that when displayed is centered
GUICreate("My GUI")
GUISetHelp("notepad") ; will run notepad if F1 is typed
$iOldOpt = Opt("GUICoordMode", 2)
$widthCell = 70
GUICtrlCreateLabel("Line 1 Cell 1", 10, 30, $widthCell) ; first cell 70 width
GUICtrlCreateLabel("Line 2 Cell 1", -1, 0) ; next line
GUICtrlCreateLabel("Line 3 Cell 2", 0, 0) ; next line and next cell
GUICtrlCreateLabel("Line 3 Cell 3", 0, -1) ; next cell same line
GUICtrlCreateLabel("Line 4 Cell 1", -3 * $widthCell, 0) ; next line Cell1
GUISetState() ; will display an empty dialog box
; Run the GUI until the dialog is closed
Do

Biên soạn : Đỗ Minh Tuân Trang 58 Tác giả: Lê Quốc Lường


7.4. TẠO CONTROL Chương 7. Giao diện đồ họa

$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.

Giá trị trả về


Th. Công : Trả về ID của control picture vừa được tạo
Hỏng : Trả về 0 nếu ảnh không tạo được ảnh
Chú ý

• Để 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>

• Đưa về kích thước mặc định : $GUI_DOCKSIZE.

• 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 đề.

Biên soạn : Đỗ Minh Tuân Trang 59 Tác giả: Lê Quốc Lường


7.4. TẠO CONTROL Chương 7. Giao diện đồ họa

• 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.

• PNG có thể được dùng với GDI+. Xem example 3.

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ố

text The text of the control.


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 đó.

Biên soạn : Đỗ Minh Tuân Trang 60 Tác giả: Lê Quốc Lường


7.4. TẠO CONTROL Chương 7. Giao diện đồ họa

[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.

Giá trị trả về


Th. Công : Trả về ID của control Input vừa tạo
Hỏng : Trả về 0
Chú ý

• Để đọ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>

• Đưa về kích thước mặc định $GUI_DOCKHEIGHT.

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

Biên soạn : Đỗ Minh Tuân Trang 61 Tác giả: Lê Quốc Lường


7.4. TẠO CONTROL Chương 7. Giao diện đồ họa

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ố

text Văn bản hiển thị trên edit


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) : $ES_WANTRETURN, $WS_VSCROLL, $WS_HSCROLL,
style $ES_AUTOVSCROLL, $ES_AUTOHSCROLL
style bắt buộc : $ES_MULTILINE, $WS_TABSTOP only if not
$ES_READONLY
exStyle [tùy chọn] Định nghĩa style mở rộng. Xem Extended Style Table.

Giá trị trả về


Th. Công : Trả về ID của Edit vừa được tạo
Hỏng : Trả về 0
Chú ý

• Để đọc nội dung của edit, xem hàm GUICtrlRead.

• Để gán thông tin cho edit , xem hàm GUICtrlSet....

• 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>

• Đưa về kích thước mặc định $GUI_DOCKAUTO

• 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

Biên soạn : Đỗ Minh Tuân Trang 62 Tác giả: Lê Quốc Lường


7.4. TẠO CONTROL Chương 7. Giao diện đồ họa

$myedit = GUICtrlCreateEdit("First line" & @CRLF, 20, 32,350, 200,


$ES_AUTOVSCROLL + $WS_VSCROLL)
GUISetState()
Send("{END}")
; will be append dont’ forget 3rd parameter
GUICtrlSetData($myedit, "Second line", 1)
; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
GUIDelete()
EndFunc ;==>Example

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.

Giá trị trả về


Th. Công : Trả về ID của checkbox vừa tạo
Hỏng : Trả về 0
Chú ý
• Để đọc trạng thái (có đánh dấu hoặc không) của checkbox, xem hàm GUICtrlRead. Để thay
đổi trạng thái của checkbox , xem hàm GUICtrlSet....
• Một checkbox có thể hiển thị kèm theo một icon hoặc ảnh, muốn thế bạn gọi style $BS_ICON
hoặc $BS_BITMAP . Sử dụng GUICtrlSetImage để lấy ảnh mà bạn muốn
• Kết hợp style mặc định với style khác, sử dụng BitOr($GUI_SS_DEFAULT_CHECKBOX,
newstyle,...).
• Thư viện chứa các giá trị nêu trên #include <ButtonConstants.au3>
• Đưa về kích thước mặc định $GUI_DOCKHEIGHT.
Ví dụ

Biên soạn : Đỗ Minh Tuân Trang 63 Tác giả: Lê Quốc Lường


7.4. TẠO CONTROL Chương 7. Giao diện đồ họa

#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.

Giá trị trả về


Th. Công : Trả về ID (mới) của nút radio vừa được tạo
Hỏng : Trả về 0
Chú ý
• Để đọc giá trị của radio (có được chọn hay không), xem hàm GUICtrlRead.
• Để thiết lập thông tin cho radio, xem hàm GUICtrlSet....
• Để kết hợp style mặc định với style khác, dùng BitOr($GUI_SS_DEFAULT_RADIO, new-
style,...).
• Để sử dụng được các giá trị nêu ở trên, cần gọi thư viện #include <ButtonConstants.au3>
• Đưa về kích thước mặc định $GUI_DOCKHEIGHT.
Ví dụ

Biên soạn : Đỗ Minh Tuân Trang 64 Tác giả: Lê Quốc Lường


7.4. TẠO CONTROL Chương 7. Giao diện đồ họa

#include <GUIConstantsEx.au3>
Opt(’MustDeclareVars’, 1)
Example()
Func Example()
Local $radio1, $radio2, $msg

GUICreate("My GUI radio")


; will create a dialog box that when displayed is centered
$radio1 = GUICtrlCreateRadio("Radio 1", 10, 10, 120, 20)
$radio2 = GUICtrlCreateRadio("Radio 2", 10, 40, 120, 20)
GUICtrlSetState($radio2, $GUI_CHECKED)
GUISetState() ; will display an dialog box with 1 checkbox
; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $radio1 And BitAND(GUICtrlRead($radio1),
$GUI_CHECKED) = $GUI_CHECKED
MsgBox(64, ’Info:’, ’You clicked the Radio 1 and it is Checked.’)
Case $msg = $radio2 And BitAND(GUICtrlRead($radio2),
$GUI_CHECKED) = $GUI_CHECKED
MsgBox(64, ’Info:’, ’You clicked on Radio 2 and it is Checked.’)
EndSelect
WEnd
EndFunc ;==>Example

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ố

Text Văn bản sẽ hiển thị trong List box


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) : $LBS_SORT, $WS_BORDER, $WS_VSCROLL
style bắt buộc : $WS_TABSTOP, $LBS_NOTIFY
exStyle [tùy chọn] Định nghĩa style mở rộng. Xem Extended Style Table.

Biên soạn : Đỗ Minh Tuân Trang 65 Tác giả: Lê Quốc Lường


7.4. TẠO CONTROL Chương 7. Giao diện đồ họa

Giá trị trả về


Th. Công : Trả về ID của listbox vừa tạo
Hỏng : Trả về 0
Chú ý

• Để đọc các giá trị của listbox , xem hàm GUICtrlRead

• Để 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>

• Đưa về kích thước mặc định (size và vị trí) : $GUI_DOCKAUTO

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

Biên soạn : Đỗ Minh Tuân Trang 66 Tác giả: Lê Quốc Lường


7.4. TẠO CONTROL Chương 7. Giao diện đồ họa

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.

Giá trị trả về


Th. Công : Trả về ID của listview vừa được tạo
Hỏng : Trả về 0
Chú ý
• Để thêm các mục vào Listview , sử dụng hàm GUICtrlCreateListViewItem

• 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ụ

Biên soạn : Đỗ Minh Tuân Trang 67 Tác giả: Lê Quốc Lường


7.4. TẠO CONTROL Chương 7. Giao diện đồ họa

#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.

Biên soạn : Đỗ Minh Tuân Trang 68 Tác giả: Lê Quốc Lường


7.5. CẬP NHẬT CONTROL Chương 7. Giao diện đồ họa

• $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 Cập nhật Control


7.5.1 GUICtrlDelete
Xóa bỏ một control
GUICtrlDelete ( controlID )
Các tham số
controlID: Định danh (ID) của control . Định danh này được trả về bởi hàm GUICtrlCreate...
Giá trị trả về
Th. Công : Trả về 1
Hỏng : Trả về 0.
Chú ý
Đối với việc xóa ContextMenu (menu ngữ cảnh) , xem remark của GUICtrlCreateContextMenu.

Biên soạn : Đỗ Minh Tuân Trang 69 Tác giả: Lê Quốc Lường


7.5. CẬP NHẬT CONTROL Chương 7. Giao diện đồ họa

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

Loại Giá trị


Checkbox, Radio Trạng thái của nút bấm (xem bảng trạng thái State trong file help)
Combo, List Giá trị được chọn
Input, Edit Văn bản đã nhập vào
Button Văn bản đang hiển thị
Date Ngày được chọn
Progress Phần trăm hiện hành
Slider Giá trị hiện hành
Một số hoặc ID của control tabitem đã chọn , phụ thuộc vào giá trị tham
Tab
số Advanced
Menu, MenuItem Trạng thái của menu/item. Xem State table
TreeView ID của control TreeViewItem được chọn
TreeViewItem Trạng thái của TreeViewItem
Định danh (ID) của ListViewItem đã chọn. 0 có nghĩa là không có mục nào
ListView
được chọn
Dummy Giá trị được gán bởi GUICtrlSendToDummy hoặc GUICtrlSetData

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 !

Loại Giá trị bổ sung


Checkbox, Radio Văn bản của control
Menu, MenuItem Văn bản của control
TreeView Văn bản của TreeViewItem đang được chọn
TreeViewItem Văn bản của treeviewitem

Biên soạn : Đỗ Minh Tuân Trang 70 Tác giả: Lê Quốc Lường


7.5. CẬP NHẬT CONTROL Chương 7. Giao diện đồ họa

Trạng thái của ListViewItem nếu style mở rộng $LVS_EX_CHECKBOXES


ListViewItem
sử dụng trong chế độ advanced . Xem state table
Tab ID của control tabitem được chọn

• 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ụ :

Func MySortFunction($nListViewID, $LParam1, $LParam2, $nColumn)...


EndFunc
hoặc
Func MySortFunction($nListViewID, $LParam1, $LParam2)...
EndFunc

Khi hàm được gọi thì 4 tham số trên sẽ mang các giá trị sau :

Vị trí Tham số Ý nghĩa


1 controlID ID của ListView mà hàm cần sử dụng
2 lParam1 Giá trị của mục đầu tiên (theo mặc định là mục controlID).
3 lParam2 Giá trị của mục thứ hai (theo mặc định là mục controlID).
4 column Cột sẽ được nhấp để sắp xếp (cột đầu tiên là 0).

Những giá trị sau sẽ được trả về để thay đổi cách chạy của hàm:

Giá trị trả về Ý nghĩa


-1 Mục thứ nhất đặt trước mục thứ hai

Biên soạn : Đỗ Minh Tuân Trang 71 Tác giả: Lê Quốc Lường


7.5. CẬP NHẬT CONTROL Chương 7. Giao diện đồ họa

0 Không đổi
1 Mục thứ nhất đặt sau mục thứ hai.

Xem thêm ví dụ trong file help để rõ cách làm việc.

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.

• Cờ đặc biệt $GUI_BKCOLOR_TRANSPARENT có thể được dùng với control Label để có


được nền trong suốt. Các control Picture thì luôn có một màu trong suốt.

• Cờ đặc biệt $GUI_BKCOLOR_LV_ALTERNATE có thể được dùng với control ListView để


làm màu nền xen kẽ cho từng dòng.

– Các dòng lẻ sẽ lấy màu từ GUICtrlSetBkColor của control ListView


– Các dòng chẳn sẽ lấy màu từ GUICtrlSetBkColor của control ListViewItem

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ố

controlID Định danh của control , được trả về từ GUICtrlCreate. . .


Đối với Combo, List, ListView, ListViewItem : văn bản của mỗi item được
ngăn cách bởi Opt("GUIDataSeparatorChar",...)
Đối với Progress : giá trị
Slider : giá trị
data
Group, Label, Button, Checkbox, Radio, Combo, List, Input, Edit, TabItem
: văn bản muốn hiển thị
Date : ngày hoặc thời gian phụ thuộc vào style của control
TreeViewItem: văn bản cần hiển thị Dummy : giá trị

Biên soạn : Đỗ Minh Tuân Trang 72 Tác giả: Lê Quốc Lường


7.5. CẬP NHẬT CONTROL Chương 7. Giao diện đồ họa

[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.

Giá trị trả về


Th. Công : Trả về 1
Hỏng : Trả về 0
Trả về -1 nếu data không hợp lệ
Chú ý

• Đối với control Combo hoặc List :

– 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.

• Đối với control ListView, ListViewItem :

• Để 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ố

controlID ID của control , được trả về từ hàm GUICtrlCreate. . .


size Size của font (mặc định là 8.5)
weight [tùy chọn] trọng lượng của font (default 400 = bình thường)
[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
attribute
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

Giá trị trả về


Th. Công : Trả về 1
Hỏng : Trả về 0
Chú ý

• Theo mặc định , control sẽ sử dụng font được thiết lập từ GUISetFont

• Size có thể là một số thập phân , như 8.5

• 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

Biên soạn : Đỗ Minh Tuân Trang 73 Tác giả: Lê Quốc Lường


7.5. CẬP NHẬT CONTROL Chương 7. Giao diện đồ họa

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ố

controlID ID của control , id này được trả về từ hàm GUICtrlCreate. . . .


left Lề trái (tọa độ x) cần gán
top Lề trên (tọa độ y) cần gán
width [tùy chọn] độ rộng mới cho control
height [tùy chọn] chiều cao mới cho control

Giá trị trả về


Th. Công : Trả về 1
Hỏng : Trả về 0

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

Biên soạn : Đỗ Minh Tuân Trang 74 Tác giả: Lê Quốc Lường


7.5. CẬP NHẬT CONTROL Chương 7. Giao diện đồ họa

Radio, Checkbox hoặc ListViewItem sẽ không được đánh dấu


$GUI_UNCHECKED
(uncheck)
$GUI_CHECKED Radio, Checkbox or ListViewItem sẽ được đánh dấu (check)
$GUI_INDETERMINATE Checkbox có ba trạng thái thuộc tính sẽ bị tô màu xám
$GUI_AVISTART Avi sẽ bắt đầu play
$GUI_AVISTOP Avi sẽ dừng chơi
$GUI_AVICLOSE Avi sẽ dừng chơi và giải phóng tài nguyên.
Control sẽ chấp nhận thao tác kéo thả : từ file hoặc từ control khác
$GUI_DROPACCEPTED
. Xem chú ý
$GUI_NODROPACCEPTED Control sẽ không chấp nhận kéo thả
Control sẽ hiển thị. Trên control Tabitem sẽ chọn tab đầu đầu tiên
$GUI_SHOW
để hiển thị
$GUI_HIDE Control sẽ ẩn
$GUI_ENABLE Control sẽ được kích hoạt để tương tác được
$GUI_DISABLE Control bị vô hiệu không tương tác (sẽ bị tô màu xám)
$GUI_FOCUS Control sẽ được đưa tiêu điểm được chọn hoặc input
$GUI_NOFOCUS Listview sẽ mất tiêu điểm.
Control sẽ được thiết lập như nút mặc định trên cửa sổ. Xem phần
$GUI_DEFBUTTON
chú ý đối với các TreeviewItem
$GUI_EXPAND TreeViewItem mở rộng các mục con
$GUI_ONTOP Control sẽ có thuộc tính ở-trên (ontop) đối với cửa sổ (zOrdering).

• 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.

• Với những control có tiếp nhận $GUI_EVENT_DROPPED, macro @GUI_DRAGID sẽ trả về


controlID từ nơi mà sự lôi-kéo bắt đầu (-1 nếu từ một file, @GUI_DRAGFILE chứa tên tập tin
đang được kéo đi) và @GUI_DROPID trả về controlID của control được thả

• 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

Biên soạn : Đỗ Minh Tuân Trang 75 Tác giả: Lê Quốc Lường


7.6. XỬ LÝ SỰ KIỆN Chương 7. Giao diện đồ họa

7.5.11 GUICtrlSetStyle
Thay đổi style cho control
GUICtrlSetStyle ( controlID, style [, exStyle] )
Các tham số

controlID ID của control , được trả về từ hàm GUICtrlCreate. . . .


stylev Style cần thiết lập cho control . Xem GUI Control Styles Appendix.
exStyle [tùy chọn] style mở rộng muốn thiết lập. Xem Extended Style Table.

Giá trị trả về


Th. Công : Trả về 1
Hỏng : Trả về 0
Chú ý
Vài style không thể được thay đổi một cách linh động. Xem tài liệu MSDN. Style cho combo box
$CBS_UPPERCASE là một ví dụ.

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 :

• Sử dụng vòng lặp thông điệp

• Sử dụng chế độ OnEvent

Vòng lặp thông điệp


Trong chế độ này , bạn sẽ sử dụng một vòng lặp khép kín để nhận liên tục các sự kiện nào sẽ xảy
ra trên GUI và ứng với mỗi sự kiện ta sẽ viết các lệnh tương ứng. Để nhận được các sự kiện nào đã
xảy ra trên GUI ta dùng hàm GUIGetMsg. Đặc điểm của chế độ này là vòng lặp và hàm GUIGetMsg
sẽ được gọi nhiều lần trong một giây.
Trong trường hợp GUI là vấn đề bạn quan tâm trên cả ,và tất cả những gì bạn cần là đợi sự kiện
xảy ra thì chế độ vòng lặp thông điệp sẽ rất phù hợp để bạn làm những việc này.
Chế độ OnEvent
OnEvent không sử dụng vòng lặp để tiếp nhận sự kiện , mà sử dụng một hàm đã định nghĩa trước
đó để phản ứng lại với một sự kiện và/hoặc một control tương ứng. Khi hàm được gọi thì đoạn chương
trình chính tạm dừng , hàm được gọi hoàn tất thì đoạn chương trình chính sẽ chạy trở lại.
Khi GUI không phải là vấn đề quan tâm hàng đầu của bạn , và bạn còn có nhiều tác vụ khác cần
xử lý bên trong đoạn chương trình chính thì OnEvent là chế độ thích hợp nhất.

7.6.2 VÒNG LẶP THÔNG ĐIỆP


Trong chế độ vòng lặp thông điệp , đoạn mã của sẽ trải qua phần lớn thời gian làm việc trong một
vòng lặp khép kín. Vòng lặp này chỉ đơn giản là sử dụng các giá trị được trả về từ hàm GUIGetMsg(
) . Các giá trị đó cho biết sự kiện nào đang xảy ra trên GUI (nút được nhấn , đóng gui, ... ).
Chế độ này chính là chế độ xử lý mặc định của AutoIt dành cho GUI. Trong chế độ vòng lặp thông
điệp bạn chỉ nhận được các sự kiện khi bạn chủ động gọi và nhận từ GUIGetMsg , vì vậy bạn phải

Biên soạn : Đỗ Minh Tuân Trang 76 Tác giả: Lê Quốc Lường


7.6. XỬ LÝ SỰ KIỆN Chương 7. Giao diện đồ họa

đả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)

Biên soạn : Đỗ Minh Tuân Trang 77 Tác giả: Lê Quốc Lường


7.6. XỬ LÝ SỰ KIỆN Chương 7. Giao diện đồ họa

Đ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

Biên soạn : Đỗ Minh Tuân Trang 78 Tác giả: Lê Quốc Lường


7.6. XỬ LÝ SỰ KIỆN Chương 7. Giao diện đồ họa

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.

7.6.3 CHẾ ĐỘ OnEvent


Trong chế độ OnEvent , việc xử lý các sự kiện xảy ra trên GUI không phải bằng cách dò xét liên
tục bằng một vòng lặp khép kín nữa , mà thay vào đó là việc tạm dừng đoạn script và gọi một hàm
đã được định nghĩa trước đó dành cho một sự kiện với một control tương ứng. Ví dụ như người dùng
nhấp vào nút Button1 thì đoạn chương trình chính của bạn nhất thời sẽ ngưng lại để gọi hàm đã tạo
trước đó dành cho Button1. Sau khi hàm đã hoàn tất công việc của nó thì đoạn chương trình chính
của bạn sẽ chạy tiếp. Chế độ này tương tự như trong phương thức xử lý form của Visual Basic.
Khi một GUI đang thực thi, đoạn chương trình chính của bạn có thể làm bất cứ công việc gì ,
nhưng để tạo nên sự đơn giản cho các ví dụ , chúng ta sẽ tạo nên một vòng lặp While với khoảng
dừng bên trong.
Theo mặc định , GUI luôn được xử lý theo chế độ vòng lặp thông điệp. Vì vậy để chuyển sang chế
độ OnEvent ở đầu đoạn mã chúng ta phải sử dung Opt("GUIOnEventMode", 1).
Dạng OnEvent cơ bản
Dạng tổng quát có thể trình bày như sau :

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

Macro Chi tiết

Biên soạn : Đỗ Minh Tuân Trang 79 Tác giả: Lê Quốc Lường


7.6. XỬ LÝ SỰ KIỆN Chương 7. Giao diện đồ họa

@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()

Biên soạn : Đỗ Minh Tuân Trang 80 Tác giả: Lê Quốc Lường


7.6. XỬ LÝ SỰ KIỆN Chương 7. Giao diện đồ họa

;Note: at this point @GUI_CTRLID would equal $okbutton,


;and @GUI_WINHANDLE would equal $mainwindow
MsgBox(0, "GUI Event", "You pressed OK!")
EndFunc
Func CLOSEClicked()
;Note: at this point @GUI_CTRLID would equal $GUI_EVENT_CLOSE,
;and @GUI_WINHANDLE would equal $mainwindow
MsgBox(0, "GUI Event", "You clicked CLOSE! Exiting...")
Exit
EndFunc

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 :

Biên soạn : Đỗ Minh Tuân Trang 81 Tác giả: Lê Quốc Lường


7.6. XỬ LÝ SỰ KIỆN Chương 7. Giao diện đồ họa

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.

Biên soạn : Đỗ Minh Tuân Trang 82 Tác giả: Lê Quốc Lường


Chương 8

Ví dụ mẫu

8.1 Tooltip mouse


_Main()
Func _Main()
HotKeySet("{ESC}", "_Quit") ; press ESC to exit
While 1
$pos = MouseGetPos()
ToolTip("Mouse : " & $pos[0] & ", " &$pos[1] )
Sleep(10)
WEnd
EndFunc ;==>_Main
Func _Quit()
Exit

EndFunc ;==>_Quit

8.2 A text typer(Advanced)


#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <Timers.au3>
Global $string ,$def_str, $temp_str ,$i ,$len ,$run ,$nDelay ,$misc ,$timer2type
; run = 1 : playing run=2 : paused run=0 : stoped
; i : dem so ky tu can lay
$str1 = "when i saw you at the party , when you asked me girlfriend ,
i didn’t know why i can’t say clearly . You ’re as pretty as angel ,
your eyes seemed to burn my heart. My strange lover..." & @CRLF
$str2 = "When i smelt a perfume from your hair , when i kissed your body ,
the waves of love were flowing in my and your soul .
You said , don’t leave me baby ..." & @CRLF
$str3 = "When i heard words you told , when i believed your heart ,
and now i knew i was a fool . I didn’t cry but my soul was dying ,
my heart broke when you said ’’Good bye’’" & @CRLF
$str4 = "When i looked the waves of ocean , when i missed my memories ,
i felt all thing were only a deam . A full house which would never exist
in this world. The sun was setting..." & @CRLF
$str5 = "When i told my children stories , when i took my wife’s hands ,

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

Biên soạn : Đỗ Minh Tuân Trang 84 Tác giả: Lê Quốc Lường


8.2. A TEXT TYPER(ADVANCED) Chương 8. Ví dụ mẫu

$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)

Biên soạn : Đỗ Minh Tuân Trang 85 Tác giả: Lê Quốc Lường


8.3. A TEXT TYPER(BASIC) Chương 8. Ví dụ mẫu

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

8.3 A text typer(Basic)


#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <Timers.au3>
Global $str , $count, $temp , $Timer_Types
$str = " Hi there , this is a sample of auto-typed text"
$count = 0
Opt("GUICloseOnESC",0)
;============== MAKE GUI ===========================================
$gui = GUICreate("A type text (basic)", 500, 336, 193, 125)
$eMainEdit = GUICtrlCreateEdit("", 8, 11, 481, 273, BitAND($ES_AUTOVSCROLL,
$ES_AUTOHSCROLL,$ES_WANTRETURN,$WS_VSCROLL))
$txt_speed = GUICtrlCreateLabel("Speed (miliSecond) : ", 20, 300, 104, 17)
$eSpeed = GUICtrlCreateInput("50", 135, 300, 41, 21,
BitOR($ES_AUTOHSCROLL,$ES_NUMBER))
$btnStartStop = GUICtrlCreateButton("Start", 200, 295, 108, 30, 0)
$btnOpen = GUICtrlCreateButton("Open text", 365, 295, 112, 30, 0)
GUISetState(@SW_SHOW)
;===============================================================================
While 1

Biên soạn : Đỗ Minh Tuân Trang 86 Tác giả: Lê Quốc Lường


8.3. A TEXT TYPER(BASIC) Chương 8. Ví dụ mẫu

$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

Biên soạn : Đỗ Minh Tuân Trang 87 Tác giả: Lê Quốc Lường


8.3. A TEXT TYPER(BASIC) Chương 8. Ví dụ mẫu

$count = 0
_Timer_KillAllTimers($gui)
GUICtrlSetData($btnStartStop, "Start")
GUICtrlSetState($eSpeed, $GUI_ENABLE)
Return
EndIf
$temp = StringLeft($str, $count)
$temp &= "|"
GUICtrlSetData($eMainEdit, $temp)
EndFunc

Biên soạn : Đỗ Minh Tuân Trang 88 Tác giả: Lê Quốc Lường

You might also like