Báo Cáo Luận Văn Tốt Nghiệp Trang 1
Đề tài tốt nghiệp
Nghiên cứu các phương pháp
nhận dạng từ dưới Cursor
Mouse trên Destop Windows.
Viết chương trình nhận dạng
từ này
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 2
MỤC LỤC
LỜI MỞ ĐẦU 3
CHƯƠNG 1: TÌM HIỂU VỀ LẬP TRÌNH WINDOWS 4
I. Khái qt về lập trình trong Windows 5
II. Thơng điệp và xử lý thơng điệp 7
III. Giao diện thiết bị đồ họa GDI 11
IV. Cửa sổ trong Windows 15
V. Chương trình Windows tiếp nhận thơng điệp chuột 22
CHƯƠNG 2: TÌM HIỂU VỀ HOOK 26
1 - Chuỗi hook 27
2 - Thủ tục hook 27
3 - Các loại hook 28
4 - Sử dụng hook 30
5 - Hook trong Windows 3.x 31
6 - Giới thiệu một số hàm liên quan đến hook 33
CHƯƠNG 3: KỸ THUẬT OVERRIDE HÀM API 36
I. Khái qt về kỹ thuật override 37
II. Lý do sử dụng kỹ thuật override trong lập trình Windows 37
III. Cơ chế hoạt động và quản lý bộ nhớ trên Windows 16bits 38
IV. Cơ chế hoạt động và quản lý bộ nhớ trên Windows 32bits 41
V. Hiện thực kỹ thuật override trên Windows 16bits 45
VI. Một số hàm được sử dụng trong kỹ thuật override 50
đoạn đầu của Luận Án Tốt Nghiệp chúng tơi đã nghiên cứu được một số vấn đề
quan trọng và căn bản có ý nghĩa trong việc thực hiện u cầu đã đặt ra của đề tài.
Đề tài này chỉ tập trung nhận dạng từ ở dạng text trên desktop của mơi trường
Windows rồi xuất kết quả ra.
Trong thời gian làm Luận Án Tốt Nghiệp nhóm sinh viên chúng tơi đã tiến
hành nghiên cứu cơ chế hoạt động và quản lý của hệ điều hành Windows. Nghiên
cứu về phương thức lập trình trong mơi trường Windows và các phương tiện mà
Windows hỗ trợ khi lập trình. Tham khảo và nghiên cứu kỹ thuật override các hàm
giao tiếp của Windows ở chế độ 16 bit và 32 bit. Nghiên cứu cách xử lý các thơng
điệp trong Windows và tìm hiểu về cách kết xuất văn bản, về chế độ ánh xạ, vấn đề
tọa độ . . . và cách xử lý văn bản. Trên cơ sở đó bước đầu chúng tơi đã xây dựng
xong một ứng dụng có khả năng nhận dạng được từ trên nền Windows 16 bit được
viết bằng ngơn ngữ Visual C++ version 1.5 và hướng phát triển trong thời gian tới
là hiện thực nó trên nền Win32.
Báo cáo của chúng tơi sẽ lần lượt điểm qua những nội dung mà chúng tơi đã
nghiên cứu và tìm hiểu được trong thời gian qua. Sau đó là phần giới thiệu chi tiết
về chương trình từ khâu phân tích-thiết kế cho đến phần chương trình nguồn và cuối
cùng sẽ là nêu những vấn đề còn tồn tại và hướng phát triển trong tương lai.
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 4
Chương 1:
TÌM HIỂU VỀ
TÌM HIỂU VỀ
LẬP TRÌNH WINDOWS
LẬP TRÌNH WINDOWS
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 5
I - KHÁI QT VỀ LẬP TRÌNH TRONG WINDOWS:
1 - Khái qt về lập trình trong Windows:
Mơi trường lập trình Windows về cơ bản là dựa trên bộ hàm API (Application
trình. DLL là một dữ liệu chia sẻ được (shared data).
Có 3 loại DLL khác nhau:
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 6
- Thư viện liên kết động API: thuộc hệ thống Windows, khi cài hệ điều hành
thì nó đã có sẵn. Chúng được nạp khi Windows khởi động.
- Thư viện liên kết động third party: do các cơng ty khác tạo ra trên mơi
trường Windows, hỗ trợ thêm cơng tác lập trình trong Windows.
- Thư viện liên kết động do chúng ta tạo ra.
Windows sử dụng cấu trúc thư viện liên kết động DLL (Dynamic Link
Library) nhằm mục đích khơng sao chép một khối lượng lớn các mã vào trong
chương trình như ở các thư viện thơng thường. Nhờ cấu trúc động của DLL nên mọi
chương trình đều có thể truy cập thư viện trong thời gian thực thi. Các hàm API
được Windows giữ dưới dạng hỗn hợp trong một số DLL. Trong q trình dịch khi
gặp lệnh gọi hàm API từ chương trình ứng dụng thì chương trình dịch khơng thêm
mã này vào module thực hiện mà chỉ thêm các lệnh liên kết (chứa tên của DLL bên
trong có hàm cần nạp) và tên hàm đó. Khi thực thi chương trình thì hàm API thực
sự mới được nạp vào bộ nhớ để thực hiện.
Cùng với sự phát triển của Windows là sự phát triển của lập trình hướng đối
tượng, và để hỗ trợ cho việc lập trình hướng đối tượng, Microsoft đã cung cấp cho
người lập trình một bộ thư viện các lớp cơ bản để phát triển các ứng dụng hướng
đối tượng gọi là MFC (Microsoft Foundation Classes), nội dung của nó bao gồm
thơng tin về các lớp cơ bản được chuẩn hóa như lớp application; document; view;
OLE; cửa sổ; nút bấm; text; v.v…, trong các lớp này mọi thứ liên quan đến nó (bao
gồm dữ liệu và các chương trình xử lý của nó) đều được làm hồn chỉnh, người lập
trình chỉ việc lấy ra sử dụng, hoặc có thể thêm bớt một ít tính năng đặc trưng cho
đối tượng của mình. Mục tiêu chính của MFC là hệ thống hóa các hàm API, cung
cấp một thể thức gọi gọn các hàm API, cung cấp một “khung làm việc”
(framework) cực mạnh để người lập trình khơng cần phải quan tâm đến những đoạn
chương trình thuộc về “thủ tục” mà chỉ cần quan tâm đến phần cốt lõi để đạt được
LPARAM lParam; // thơng số thơng điệp thứ hai
- Hàm SendMessage gởi thơng điệp tới một hay nhiều cửa sổ. Hàm gọi thủ tục
cửa sổ cho cửa sổ và khơng trở về cho đến lúc thủ tục cửa sổ đã xử lý thơng điệp.
- Giá trị trả về: cho biết kết quả xử lý thơng điệp và phụ thuộc vào thơng điệp
được gởi.
b) Hàm PostMessage:
- Cú pháp:
BOOL PostMessage(hwnd, uMsg, wParam, lParam)
HWND hwnd; // handle của của sổ đích
UINT uMsg; // thơng điệp gởi
WPARAM wParam; // thơng số thơng điệp đầu tiên
LPARAM lParam; // thơng số thơng điệp thứ hai
- Hàm PostMessage gởi (đặt) một thơng điệp vào trong hàng thơng điệp cửa sổ
và rồi trở về mà khơng đợi cửa sổ tương ứng xử lý thơng điệp. Những thơng điệp
trong một hàng thơng điệp được lấy bằng cách gọi hàm SetMessage hay
PeekMessage.
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 8
- Giá trị trả về: trả về khác 0 nếu thành cơng, ngược lại 0.
c) Hàm SendDlgItemMessage:
- Cú pháp:
LRESULT SendDlgItemMessage(hwndDlg,idDlgItem,uMsg,wParam,lParam)
HWND hwndDlg; // handle của hộp hội thoại
int idDlgItem; // mã nhận diện ơ điều khiển sẽ nhận thơng điệp
UINT uMsg; // thơng điệp gởi đi
WPARAM wParam; // thơng số thơng điệp đầu tiên
LPARAM lParam; // thơng số thơng điệp thứ hai
- Hàm SendDlgItemMessage gởi một thơng điệp tới một điều khiển trong hộp
hội thoại.
- Giá trị trả về: cho biết kết quả xử lý thơng điệp và phụ thuộc vào thơng điệp
Báo Cáo Luận Văn Tốt Nghiệp Trang 9
Nó mơ tả đơn giản hóa q trình xử lý thơng điệp. Thơng điệp có thể bắt
nguồn từ nhiều cách khác nhau, sơ đồ sau đây sẽ giải thích chi tiết hơn về vòng lặp
thơng điệp và chỉ ra cách thơng điệp được đặt vào hàng đợi như thế nào:
Thơng điệp khơng chỉ phát xuất từ sự kiện phần cứng, cũng có thể có thơng
điệp của chương trình phát xuất từ một chương trình đang chạy. Các threads có thể
gởi dữ liệu trở về sau và về trước bằng cách gởi thơng điệp. Thơng điệp có thể gởi
vào hàng đợi bằng hàm PostMessage() , hoặc chúng có thể được gởi trực tiếp cho
vòng lặp thơng điệp để xử lý ngay lập tức bằng hàm SendMessage().
4 - Xử lý thơng điệp:
Việc xử lý thơng điệp là yếu tố chính làm cho các ứng dụng Windows vận
hành được. Hệ thống và các ứng dụng khác sinh ra các thơng điệp cho mọi sự kiện
xuất hiện trong hệ thống thơng điệp của Windows sẽ cho phép Windows chạy đa
nhiệm trong một thời điểm. Windows 95 và Windows NT mở rộng khả năng của
version Windows trước bằng việc cấp phát cho mỗi dòng xử lý (thread) hay mỗi
tiến trình (proccess) một hàng đợi thơng điệp riêng. Trong version Windows cũ thì
tất cả ứng dụng đều dùng chung một hàng đợi thơng điệp, vì thế để các ứng dụng
SVTH : Lương Cao Hoài Tâm Lớp TH40
Hardware Events
Message Sent
From Other Threads
System Dispatcher
System Message Queue
Thread Message Queue
WndProc()
Message Loop
PostMessage()
TranslateMessage()
SentMessage()
SentMessage()
có nhiệm vụ duy trì sự độc lập của Windows đối với các thiết bị đồ họa (cho phép
Windows làm việc với nhiều thiết bị đồ họa khác nhau). Windows GDI là một thư
viện bao gồm một số hàm giúp kết xuất đồ họa (graphic output) lên màn hình, máy
in…GDI sẽ tạo ra: điểm, đường kẻ, hình dạng (shape: chữ nhật, tròn…), chữ văn
bản.
2 - Device Context:
Ngữ cảnh thiết bị DC (Device Context) là một phần quan trọng của GDI
Windows. Một DC là một cấu trúc dữ liệu dài khoảng 800 bytes được Windows duy
trì có nhiệm vụ lo lưu giữ những thơng tin cần thiết mà ứng dụng sẽ cần đến khi
phải hiển thị kết xuất lên một thiết bị vật lý. GDI khơng bao giờ cho phép chương
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 11
trình làm việc trực tiếp với một DC mà GDI phân phối cho chương trình một handle
để nhận dạng một DC cụ thể. Tất cả các hàm API; GDI đều nhận thơng số đầu tiên
là một handle – hdc.
DC là một cơng cụ chứa các thuộc tính vẽ, DC cho phép kết nối logic một
chương trình về một thiết bị cụ thể nào đó. Ngồi ra do Windows là một hệ điều
hành đa nhiệm nên các chương trình khơng thể truy xuất trực tiếp các thiết bị vật lý
để tránh xung đột. Thay vào đó, chương trình Windows phải sử dụng kết nối logic
do DC đại diện. Nghĩa là tất cả các chương trình cách tiếp cận này để GDI có thể
giải quyết tranh chấp khi 2 chương trình u cầu dùng cùng một thiết bị nên DC còn
có vai trò làm permission slip. DC lưu trữ thơng tin liên quan đến mặt bằng vẽ và
những khả năng của nó. Trước khi sử dụng bất kỳ hàm vẽ GDI nào thì điều phải tạo
một DC cho thiết bị, và khi sử dụng xong thì phải trả nó về cho Windows nhằm
đảm bảo cho hoạt động của hệ thống được thơng suốt bởi vì số lượng DC mà
Windows quản lý là có giới hạn.
DC ở Win16: Ngữ cảnh thiết bị (DC) là một nối kết giữa một ứng dụng
Windows, một driver thiết bị và một thiết bị đầu ra (output device). Windows duy
trì một cache gồm 5 DC đặc biệt cho hoạt động hệ thống. Ứng dụng phải giải phóng
các DC này sau khi sử dụng.
Output
Device
Báo Cáo Luận Văn Tốt Nghiệp Trang 12
3 - Chế dộ ánh xạ (mapping mode):
Để duy trì sự độc lập thiết bị, GDI tạo ra output ở khơng gian luận lý và ánh
xạ nó lên màn hình. Chế độ ánh xạ cho biết mối quan hệ giữa khơng gian luận lý và
những pixel trên thiết bị.
Có tới 8 chế độ ánh xạ khác nhau nhưng chúng tơi chỉ quan tâm tới chế độ ánh
xạ MM_TEXT vì đây là chế độ ánh xạ mặc định. Trong chế độ này một đơn vị luận
lý được ánh xạ tới một pixel trên thiết bị hay màn hình. Như vậy đơn vị tính luận lý
là pixel và các tọa độ x, y cũng được tính theo pixel, trị x tăng khi qua phải và giảm
khi qua trái, trị y tăng khi đi xuống và giảm khi đi lên. Origin của hệ thống tọa độ là
góc trái-trên (upper-left) của màn hình.
4 - Hệ thống tọa độ windows:
Windows sử dụng các hệ thống tọa độ khác nhau tùy theo hồn cảnh như:
Hệ toạ độ thiết bị (Device coordinate system)
- Hệ toạ độ tồn màn hình (Full screen coordinate system)
- Hệ toạ độ vùng client (Client area coordinate system)
- Hệ toạ độ tồn cửa sổ (Whole window coordinate system)
- Hệ toạ độ logic (Logical coordinate system)
Trong phạm vi ứng dụng của đề tài chúng tơi chỉ quan tâm đến các hệ toạ độ :
a) Full screen coordinate system:
Là hệ thống tọa độ thiết bị liên quan tới trọn màn hình. Tọa độ màn hình được
tính theo pixel và chọn tọa độ (0,0) làm góc upper-left của màn hình. Hệ thống này
sử dụng khi liên quan đến trọn màn hình trên tọa độ màn hình. Thường vị trí của
một đối tượng như con nháy hoặc con trỏ hoặc cửa sổ so với góc upper-left của màn
hình thì dùng hệ tọa độ này.
b) Client area coordinate system:
Cũng là hệ tọa độ thiết bị, nó khác với hệ tọa độ trọn màn hình ở origin của hệ
tọa độ. Tọa độ trọn màn hình là tương đối so với upper-left của màn hình còn tọa độ
xviewportOrg
yviewport = (ywindow - ywindowOrg)(yviewportExt / ywindowExt) +
yviewportOrg
Trong đó:
(xwindow,ywindow) là điểm trên tọa độ logic được chuyển đổi thành điểm
(xviewport,yviewport)
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 14
(xwindowOrg,ywindowOrg) và (xviewportOrg,yviewportOrg) là origin của
vùng hình chữ nhật window và viewport theo mặc nhiên các điểm này được cho về
(0,0) trên DC mặc nhiên.
Cơng thức sử dụng 2 điểm cho biết extent của một vùng theo tọa độ logic
(xwindowExt,ywindowExt) và của một vùng theo hệ tọa độ thiết bị
(xviewportExt,yviewportExt).
Tỉ lệ của (viewpot extent / window extent) là hệ số scaling dùng để dịch đơn
vị logic qua đơn vị thiết bị.
Việc chuyển đổi ngược lại tương tự bằng các biến đổi cơng thức trên.
IV - CỬA SỔ TRONG WINDOWS:
Cửa sổ là khái niệm cơ bản trong giao diện GDI của Windows, nó là một kiến
trúc chuẩn mực để từ đó xây dựng nên các đối tượng khác như: cửa sổ chính của
ứng dụng (main frame); text box; edit control; button; combo box; menu; scroll
bar; nói chung là tồn bộ những cơng cụ tạo nên giao diện GDI đều có thể gọi là
cửa sổ. Cũng có thể xem cửa sổ như vùng chữ nhật màn hình mà nơi đó ứng dụng
in ra các kết xuất và nhận các dữ liệu từ người dùng.
Windows quản lý tất cả cửa sổ hiện có trong hệ thống bằng cách gán cho mỗi
cửa sổ một handle (trên thực tế nó là một số ngun), ta chỉ cần có được handle cửa
sổ thì có thể thao tác mọi thứ trên cửa sổ đó.
Một cửa sổ chia sẻ màn hình với các cửa sổ khác, kể cả các cửa sổ của ứng
dụng khác. Chỉ có một cửa sổ trong một thời điểm có thể nhận dữ liệu nhập từ
người dùng. Người dùng có thể dùng chuột, bàn phím, hay các thiết bị nhập khác để
- Hidden: Cửa sổ cha mẹ sẽ bị che sau cửa sổ con. Cửa sổ con sẽ được nhìn
thấy (hết bị che) (visible) chỉ khi cửa sổ cha mẹ được nhìn thấy.
- Destroyed: Cửa sổ cha mẹ bị huỷ sau cửa sổ con.
- Moved: Cửa sổ con bị di chuyển cùng với vùng client của cửa sổ cha mẹ.
Cửa sổ con đáp ứng cho việc tơ vẽ sau khi di chuyển.
- Gia tăng kích thước hay ở trạng thái kích thước cực đại: tơ vẽ bất kỳ phần
nào của cửa sổ cha mẹ mà đã được phơi bày ra như là kết quả của kích thước tăng
lên của vùng client.
Windows khơng tự động xén (clip) một cửa sổ con ra khỏi vùng client của cửa
sổ cha mẹ. Điều này nghĩa là cửa sổ cha mẹ vẽ lên trên cửa sổ con nếu nếu nó tiến
hành bất kỳ sự tơ vẽ nào trong cùng vị trí với vị trí của cửa sổ con. Windows chỉ
xén cửa sổ con ra khỏi vùng client của cửa sổ cha mẹ nếu cửa sổ cha mẹ có kiểu
WS_CLIPCHILDREN. Nếu cửa sổ con bị xén thì cửa sổ cha mẹ khơng thể tơ vẽ lên
nó. Một cửa sổ con có thể chồng lên các cửa sổ con khác trong cùng vùng client.
Cửa sổ anh em (cùng cha mẹ) có thể tơ vẽ trong mỗi vùng client của các cửa sổ
khác trừ khi một cửa sổ con có kiểu WS_CLIPSIBLINGS. Nếu ứng dụng xác định
kiểu này cho một cửa sổ con thì bất kỳ phần nào của cửa sổ anh em của cửa sổ con
đó nằm trong cửa sổ này đều bị xén. Nếu một cửa sổ có kiểu WS_CLIPCHILDREN
hoặc WS_CLIPSIBLINGS thì một mất mát nhỏ trong sự thực hiện (performance)
xảy ra. Mỗi cửa sổ chiếm tài ngun hệ thống bởi vậy ứng dụng sẽ khơng sử dụng
các cửa sổ con một cách bừa bãi. Để hoạt động tối ưu một ứng dụng cần chia luận
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 16
lý cửa sổ chính của nó trong thủ tục cửa sổ của cửa sổ chính còn hơn là dùng các
cửa sổ con.
2 - Thủ tục cửa sổ (Window Procedures):
Một thủ tục cửa sổ xử lý tất cả những thơng điệp được gởi tới tất cả các cửa sổ
trong lớp được đưa ra. Windows gởi các thơng điệp tới thủ tục cửa sổ khi nó nhận
input từ user có ý định chuyển cho cửa sổ được đưa ra hay khi nó cần thủ tục để
thực hiện một vài hành động trên cửa sổ của nó như việc tơ vẽ lại bên trong vùng
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 17
Thủ tục cửa sổ cũng nhận các thơng điệp mà thực sự đã dự định được xử lý
bởi hệ thống. Những thơng điệp vùng-nonclient thơng báo cho thủ tục biết user thực
hiện một vài hành động trong vùng client của cửa sổ hoặc một vài thơng tin về cửa
sổ được u cầu bởi hệ thống để thực hiện một hành động. Mặc dù Windows
chuyển những thơng điệp này tới thủ tục cửa sổ thì thủ tục sẽ chuyển chúng cho
hàm DefWindowProc và khơng cố gắng xử lý chúng. Ở trường hợp này thủ tục cửa
sổ phải phớt lờ thơng điệp hay trả về khơng chuyển nó tới DefWindowProc.
3) Thơng điệp cửa sổ:
Một thơng điệp cửa sổ là một tập những giá trị mà Windows gởi tới thủ tục
cửa sổ để cung cấp input cho cửa sổ hay u cầu cửa sổ thực hiện một vài hành
động. Windows tính đến một sự thay đổi rộng khắp những thơng điệp mà nó hay
ứng dụng của nó có thể gởi tới thủ tục cửa sổ. Hầu hết những thơng điệp được gởi
tới cửa sổ như là kết quả của hàm đưa ra đang được thực thi hay như là kết quả của
input từ user. Mỗi thơng điệp gồm 4 giá trị: một handle xác định cửa sổ, một danh
hiệu thơng điệp, một giá trị thơng điệp-đặc biệt 16-bit và một giá trị thơng điệp-đặc
biệt 32-bit. Những giá trị này được chuyển tới thủ tục cửa sổ như là những thơng số
riêng lẻ. Rồi thủ tục cửa sổ kiểm tra danh hiệu thơng điệp để quyết định những đáp
ứng gì phải làm và làm thế nào để thơng dịch giá trị 16-bit và 32-bit.
Cú pháp thủ tục cửa sổ:
- LONG FAR PASCAL WndProc(hwnd, wMsg, wParam, lParam)
HWND hwnd;
WORD wMsg;
WORD wParam;
DWORD lParam;
Các thơng số:
hwnd cho biết cửa sổ nhận thơng điệp
wMsg loại thơng điệp
wParam thơng tin thơng điệp-đặc biệt thêm vào 16-bit
thay đổi như đã định nghĩa bởi vùng cập nhật và cuối cùng nó phải gọi EndPaint để
hồn tất cơng việc. Một cửa sổ có thể vẽ trong vùng client của nó bất kỳ lúc nào tức
là ngồi thời điểm mà nó đáp ứng thơng điệp WM_PAINT chỉ cần nó lấy ngữ cảnh
màn hình cho vùng client trước lúc nó tiến hành vẽ.
Thơng điệp WM_PAINT: là một u cầu của Windows tới một cửa sổ để cập
nhật màn hình cửa nó. Windows gởi WM_PAINT bất cứ khi nào cần vẽ một phần
lại cửa sổ. Khi cửa sổ nhận thơng điệp WM_PAINT thì nó sẽ lấy vùng cập nhật
bằng hàm BeginPaint và nó sẽ tiến hành bất kỳ hoạt động gì cần thiết để cập nhật
phần đó của vùng client.
InvalidateRect và InvalidateRgn thực sự khơng sinh ra thơng điệp
WM_PAINT. Windows tích luỹ những thay đổi được tạo ra bởi các hàm này và
những thay đổi của riêng nó trong lúc một cửa sổ xử lý những thơng điệp khác
trong hàng thơng điệp của nó. Làm trễ WM_PAINT làm cho cửa sổ xử lý tất cả
những thay đổi cùng một lúc thay vì cập nhật những những mẫu nhỏ trong những
bước riêng lẻ làm lãng phí thời gian.
Để chỉ thị Windows gởi thơng điệp WM_PAINT một ứng dụng có thể sử dụng
UpdateWindow, hàm này gởi thơng điệp trực tiếp tới cửa sổ, bất chấp những thơng
điệp khác trong hàng thơng điệp của ứng dụng. UpdateWindow được sử dụng khi
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 19
một cửa sổ cần cập nhật vùng client của nó ngay lập tức (chẳng hạn chỉ ngay sau
cửa sổ được tạo). Khi một cửa sổ nhận WM_PAINT nó phải gọi BeginPaint để lấy
ngữ cảnh màn hình cho vùng client và lấy thơng tin khác như vùng cập nhật và
background bị xóa hay khơng. Windows tự động chọn vùng cập nhật như là vùng
xén của ngữ cảnh màn hình. GDI huỷ bỏ (xén) những gì được vẽ bên ngồi vùng
xén chỉ những gì ở bên trong vùng cập nhật là thực sự nhìn thấy được. BeginPaint
xóa vùng cập nhật để ngăn chặn vùng giống nhau từ việc sinh ra các thơng điệp
WM_PAINT đến sau. Sau khi vẽ xong Windows phải gọi hàm EndPaint để giải
phóng DC.
Vùng cập nhật: Một vùng cập nhật xác định phần của vùng client được đánh
Scan code
Báo Cáo Luận Văn Tốt Nghiệp Trang 20
1 - Mouse:
Khi mouse báo vị trí của mình (vị trí cursor) và có tác động lên mouse thì một
tín hiệu được phát đi từ mouse gây ra một ngắt qng, mouse driver giải quyết ngắt
qng này.
2 - Mouse device driver:
Khi Windows khởi động thì mouse driver tự động nạp vào và kiểm tra xem có
chuột hay khơng. Nếu có thì Windows gọi driver cung cấp một thủ tục để báo cáo
các biến cố xảy ra trên chuột. Khi có một mouse event thì driver thơng báo cho
Windows biết. Nếu event là di chuyển mouse thì ưu tiên đáp ứng vị trí con trỏ di
chuyển ngay lúc ngắt. Còn lại tất cả các event khác đều được đưa vào hardware
event queue.
3 - Hardware event queue:
Các mouse event được đưa vào hardware event queue chờ giao cho message
loop của chương trình giải quyết. Queu này là một vùng đệm có thể chứa tối đa 120
event. Những event trong queue chưa thuộc một chương trình cụ thể nào cho tới khi
nó được tiếp nhận bởi hàm GetMessage(). Điều này đảm bảo cho hệ thống hoạt
động đúng đắn. Sau đó là vòng lặp GetMessage().
4 - GetMessage() loop:
GetMessage() loop đưa các thơng điệp vào xử lý. GetMessage() sẽ quyết định
chương trình nào sẽ tiếp nhận thơng điệp bằng cách xem chương trình nào sở hữu
cửa sổ mà con trỏ chuột nằm trên đó. Tùy theo vị trí của con trỏ mà phát sinh hai
loại thơng điệp: thơng điệp vùng client và thơng điệp vùng non-client. Muốn biết
cursor ở vùng nào thì GetMessage() chuyển đi một thơng điệp WM_NCHITTEST
cho thủ tục cửa sổ. Hàm GetMessage() dựa vào cơ chế pull-model để đọc thơng tin
tình huống trong queue và lại dựa vào push-model để biết vị trí của cursor. Tức là
GetMessage() sẽ gọi thủ tục cửa sổ như là một chương trình thường trú vậy.
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 21
chuột của vùng client hoặc vùng non-client. Khi GetMessage() sẵn sàng đem một
thơng điệp vào chương trình của ta thì nó sẽ gọi hook xem có thay đổi gì khơng
trước khi thơng điệp được chuyển cho chương trình.
Khi GetMessage() đã đưa thơng điệp vào chương trình rồi thì thơng điệp sẽ
được trao trực tiếp cho thủ tục cửa sổ thích hợp bởi hàm DispatchMessage(). Bây
giờ thơng điệp đã nằm trong thủ tục cửa sổ.
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 22
5 - Thủ tục cửa sổ:
Hơn 20 thơng điệp của Windows về chuột (trừ WM_NCHITTEST) thì có 10
thơng điệp thuộc vùng non-client do DefWindowProc() giải quyết. Hai thơng số
wParam, lParam của thủ tục cửa sổ sẽ cho biết thơng tin về thơng điệp. Trị của hai
thơng số lParam và wParam đều tương tự nhau cho các thơng điệp chuột trên vùng
client.
Trị của thơng số lParam chứa vị trí cursor theo tọa độ của vùng client. Tọa độ
này cho origin về góc upper-left của vùng client với đơn vị tính là pixel. Trị x nằm
ở word thấp còn y nằm ở word cao của lParam.
Trị của wParam là một lơ cờ hiệu mơ tả trạng thái của các nút chuột cũng như
trạng thái các nút <Ctrl>, <Shift>
6 – DefWindowProc():
Đối với chuột thì DefWindowProc() khơng quan tâm đến những thơng điệp
thuộc vùng client mà chỉ quan tâm đến những thơng điệp thuộc vùng non-client.
DefWindowProc() có nhiệm vụ cung cấp một giao diện chung cho bàn phím
và con chuột bằng cách dịch phần nhập liệu từ bàn phím hoặc con chuột thành các
lệnh hệ thống (system command) và cho hiện lên như các thơng điệp
WM_SYSCOMMAND. Cuối cùng DefWindowProc() giải quyết các thơng điệp
WM_NCHITTEST và WM_SETCURSOR cung cấp trước cho các thơng điệp chuột
khác.
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 23
thủ tục hook và sử dụng hàm SetWindowsHookEx để đặt nó vào trong chuỗi hook.
Một thủ tục hook có cú pháp:
- LRESULT CALLBACK HookProc (
Int nCode,
WPARAM wParam,
LPARAM lParam
);
HookProc là một placeholder cho một ứng dụng đã được định nghĩa trước.
Thơng số nCode là một mã hook phụ thuộc vào kiểu hook; mỗi kiểu có một
tập các đặc tính các mã hook. Những giá trị của thơng số wParam và lParam phụ
thuộc vào mã hook, nhưng điển hình thì chúng chứa thơng tin về một thơng điệp
SVTH : Lương Cao Hoài Tâm Lớp TH40
Báo Cáo Luận Văn Tốt Nghiệp Trang 25
được send hay được post. Hàm SetWindowsHookEx ln ln đặt một thủ tục
hook ở đầu một chuỗi hook. Khi một sự kiện xảy ra mà sự kiện này được quản lý
bởi một kiểu hook cụ thể thì hệ thống gọi thủ tục ở đầu chuỗi hook đã được tổ chức.
Mỗi thủ tục hook trong chuỗi quyết định nên chuyển hay khơng chuyển sự kiện tới
thủ tục tiếp theo. Một thủ tục hook chuyển một sự kiện tới thủ tục tiếp theo bằng
cách gọi hàm CallNextHookEx. Chú ý rằng những thủ tục hook dành cho các kiểu
hook chỉ có thể quản lý các thơng điệp, hệ thống chuyển thơng điệp tới mỗi thủ tục
hook, chứ khơng dính dáng gì đến có hay khơng một thủ tục cụ thể gọi
CallNextHookEx. Một thủ tục hook có thể tồn cục, quản lý những thơng điệp đối
với tất cả các thread trong hệ thống hay nó có thể là thread cụ thể, quản lý các thơng
điệp cho chỉ một thread riêng biệt. Một thủ tục hook tồn cục có thể được gọi trong
ngữ cảnh của bất kỳ ứng dụng nào, bởi thế thủ tục phải ở trong một module DLL
riêng lẻ. Một thủ tục hook loại thread cụ thể chỉ được gọi trong ngữ cảnh của thread
đã được tổ chức. Nếu một ứng dụng đặt một thủ tục hook cho một trong các thread
của riêng nó thì thủ tục hook có thể ở trong cả module giống nhau như qng nghĩ
giữa các mã ứng dụng hoặc trong một DLL. Nếu ứng dụng đặt một thủ tục hook
cho một thread của một ứng dụng khác thì thủ tục phải ở trong một DLL. Chú ý chỉ