Tài liệu Luận văn Nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên Desktop Windows - Pdf 97


Luận văn

Nghiên cứu các phương
pháp nhận dạng từ dưới
cursor mouse trên
Desktop Windows

Báo Cáo Luận Văn Tốt Nghiệp Trang 1

Đề tài : Nghiên cứu các phương pháp nhận
dạng từ dưới cursor mouse trên Desktop
Windows.

quan trọng và căn bản có ý nghĩa trong việc thực hiện yê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
Báo Cáo Luận Văn Tốt Nghiệp Trang 2

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.
Báo Cáo Luận Văn Tốt Nghiệp Trang 3

Chương 1:
T
T
Ì
Ì
M
M
T
T
R
R
Ì
Ì
N
N
H
H

W
W
I
I
N
N
D
D
O
O
W
W
S
S

dụng tập các hàm được
gọi là giao diện chương trình ứng dụng API (Application Program Interface).
Chương trình của người sử dụng có thể gọi tới các hàm API để truy cập tới mọi tài
nguyên của Windows. GDI là một bộ phận của API, giao diện thiết bị đồ họa GDI
(Graphic Device Interface) có nhiệm vụ duy trì sự độc lập của Windows đối với các
thiết bị đồ họa hay còn gọi là khả năng độc lập thiế
t bị (device independent) tức là
cho phép Windows làm việc với nhiều kiểu thiết bị đồ họa khác nhau.
2 - Thư viện liên kết động DLL (Dynamic Link Library):

Thư viện liên kết động là các tập tin được Windows lưu dưới dạng nhị phân
chứa các hàm mà mọi ứng dụng trên Windows đều có thể sử dụng. Nét đặc trưng
của DLL là nó có thể được sử dụng bởi nhiều ứng dụng tại cùng một thời điểm hay
nói cách khác thư viện liên kết động có thể cùng một lúc được gọi bởi nhiều chương
trình. DLL là một dữ liệ
u chia sẻ được (shared data).
Có 3 loại DLL khác nhau:
Báo Cáo Luận Văn Tốt Nghiệp Trang 5

- 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 quá trình dịch khi

cửa sổ khác.
Báo Cáo Luận Văn Tốt Nghiệp Trang 6

Trong Windows có 3 loại thông điệp cơ bản:
- Những thông điệp tổng quát: có mã nhận diện mang tiền tố WM_ được coi là
phần lớn trong ứng dụng và Windows đã cung cấp các hàm để giải quyết.
- Những control notification: đây là những thông điệp WM_COMMAND
được chuyển từ cửa sổ con tới cửa sổ bố mẹ.
- Những nút lệnh: là thông điệp WM_COMMAND phát đi từ trình đơn, từ các
nút điề
u khiển. Đây là loại thông điệp yêu cầu ứng dụng phải thực hiện một công
việc gì đó.
2 - Gởi đi các thông điệp:

Windows cho phép ứng dụng gởi đi những thông điệp cho mình, cho các ứng
dụng khác hoặc cho hệ thống.
Có 3 hàm Windows API để gởi thông điệp đi:
a) Hàm SendMessage:

Cú pháp:
LRESULT SendMessage(hwnd, uMsg, wParam, lParam)
HWND hwnd; // handle của cửa sổ nhận (đí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 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.

3 - Vòng lặp thông điệp:

Một thread hoặc một process đẩy một thông điệp ra khỏi hàng đợi bằng cách
dùng vòng lặp thông điệp. Vòng loop chính của một ứng dụng đặt tại cuối hàm
WinMain() của ứng dụng đó. Vòng lặp thông điệp có dạng như sau:

while GetMessage(&msg,NULL,0,0)
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}

Sau đây là Sơ đồ dòng thông điệp: Thread1 Message Queue Thread2 Message Queue Thr ead3 Message Queue
System Dispatcher
Hardware Event Occur
System Message Queue
GetMessage()
Tr ansl at eMessage( )
Dispatch Message( )
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
Hardware Events
Message Sent
From Other Threads
System Dispatcher
System Message Queue
Thr ead Message Queue
WndProc()
Message Loop
PostMessage()


Windows là một hệ điều hành đa nhiệm (multitasking) trong đó các ứng dụng
giao tiếp với user thông qua một hay nhiều giao diện. Để truy xuất các giao diện thì
chương trình ứng dụng phải sử dụng các hàm Giao diện chương trình ứng dụng.
API là tập các lệnh mà một ứng dụng sử dụng để yêu cầu và tiến hành các dịch vụ
cấp thấp được thi hành bởi Windows.
Giao diện thiết bị đồ h
ọa GDI (Graphic Device Interface) là một phần của API
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
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
Báo Cáo Luận Văn Tốt Nghiệp Trang 10

để 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ể Windows
Application
GDI
Device
Device
Driver
Output
Device
Windows
Application
Windows
A
pp
lication
Device
Driver
Device
Driver
Output
Device
Output
Device
Báo Cáo Luận Văn Tốt Nghiệp Trang 11


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 độ
vùng client là tương đối so với upper-left của vùng client. Tọa độ này cũng tính theo
device unit (pixel) giống như tọa độ màn hình.
Hàm ClientToScreen để chuyển tọa độ vùng client qua tọa độ trọn màn hình.
Báo Cáo Luận Văn Tốt Nghiệp Trang 12

Hàm ScreenToClient chuyển tọa độ trọn màn hình qua tọa độ vùng client.
c) Whole window coordinate system:

Gần giống hệ tọa độ vùng client, là tương đối so với góc upper-left của cửa sổ,
được sử dụng khi vẽ vùng nonclient của cửa sổ.
d) Logical coordinate:

Hầu hết các hàm GDI sử dụng hệ tọa độ này. Hệ thống tọa độ logic không
phải là hệ thống tọa độ thiết bị, hệ thống tọa độ logic bao giờ cũng được ánh xạ lên
một hệ thống tọa độ thiết bị. Hệ tọa độ logic có thể được ánh xạ lên hệ tọa độ tồn
màn hình, hệ tọa độ vùng client hoặc hệ t
ọa độ tồn cửa sổ.
Dùng hàm DPtoLP để chuyển tọa độ thiết bị sang hệ tọa độ logic.
Dùng hàm LPtoDP để chuyển tọa độ logic sang hệ tọa độ thiết bị.
Như vậy điều quan trọng trong việc tính tốn sử dụng hệ tọa độ là phải kiểm sốt
được việc sử dụng các hệ tọa độ một cách đồng bộ bởi vì vi
ệc chuyển đổi giữa các
hệ tọa độ đã được cung cấp bởi các hàm nêu trên.
5 - Viewport và window:

Mapping mode cho biết ánh xạ tọa độ logic và những kích thước được cung
cấp khi gọi các hàm GDI qua hệ thống tọa độ thiết bị gắn liền với DC. Tức là

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ố nguyên)ø, 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 để
tương tác với cửa sổ này và ứng dụng sở hữu nó.
1 - Các loại cửa sổ:

Windows cung cấp nhiều kiểu cửa sổ khác nhau để có thể kết hợp hình thành
nên các hình thức cửa sổ khác nhau. Các kiểu được sử dụng trong hàm
CreateWindow khi cửa sổ được tạo.
Một số kiểu cửa sổ sau:
- Cửa sổ chồng lên nhau (Overlapped windows hay top-level window): là cửa
sổ không bao giờ có cửa sổ cha mẹ.
- Cửa sổ bị sở hữu (Owned windows): là kiểu đặc biệt, được sở hữu bởi m
ột
cửa sổ bị chồng
- Cửa sổ pop-up: là kiểu đặc biệt của cửa sổ overlapped nhưng có thể có hoặc
không title bar.
- Cửa sổ con: là cửa sổ xác định vùng client của cửa sổ cha mẹ, được sử dụng
để chia vùng client của cửa sổ cha mẹ ra thành các vùng chức năng khác nhau. Một
ứng dụng dùng hàm ShowWindow để cho thấy hay che dấu một cửa sổ con. Mỗi

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 nguyên 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
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.
Báo Cáo Luận Văn Tốt Nghiệp Trang 15

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
client.
Thủ tục cửa sổ nhận các kiểu thông điệp như: nhập vào từ bàn phím, chuột;
yêu cầu tiêu đề cửa sổ; tường thuật sự thay đổi gây ra bởi cửa sổ khác (như thay đổi
file WIN.INI); cơ hội sửa đổi đáp ứng hệ thống tiêu chuẩn đến những hoạt động
chắc chắn (như điều chỉnh menu tr
ước lúc hiển thị); yêu cầu thực hiện một vài hành

DefWindowProc được yêu cầu trong tất cả các thủ tục cửa sổ.
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 yêu cầu bởi hệ thống để thực hiện một hành động. Mặc dù Windows
Báo Cáo Luận Văn Tốt Nghiệp Trang 16

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 yê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;

tồn bộ vùng client thay cho sao chép nội dung trước đó mỗi lần một cửa sổ thay đổi
kích thước thì một cửa sổ s
ẽ xác định kiểu CS_VREDRAW và trong lớp cửa sổ.
Để quản lý hiển thị màn hình, Windows tiến hành nhiều hoạt động ảnh hưởng
tới nội dung của vùng client. Nếu Windows di chuyển, định kích thước hay thay đổi
bề mặt màn hình, sự thay đổi có thể ảnh hưởng cửa sổ được đưa ra. Nếu vậy,
Windows đánh dấu vùng bị thay đổi bằng hoạt động sẵn sàng cho việc cập nhật và ở
cơ hội tiếp theo nó gởi thông điệp WM_PAINT tới cửa sổ vì thế nó có thể cập nhật
cửa sổ trong vùng cần cập nhật. Nếu một cửa sổ vẽ trong vùng client của nó thì nó
phải gọi BeginPaint để lấy handle của ngữ cảnh màn hình, phải cập nhật vùng bị
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 yê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

Hàm GetUpdateRgn lấy vùng cập nhật chính nó. Những hàm này có thể được sử
dụng để tính tốn kích thước hiện hành của vùng cập nhật để quyết định những công
việc vẽ nào được yêu cầu.
V – CHƯƠ
NG TRÌNH WINDOWS TIẾP NHẬN THÔNG ĐIỆP CHUỘT:
Giới thiệu dòng chảy dữ liệu thông điệp nhập từ con chuột: Hardware event
queue
Device drive
r
Mouse
GetMessa
g
e()
DispatchMessage()
WindowProc()
DefWindowProc()
Hook
chain

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.
GetMessage() sử dụng hàm SendMessage() để gọi thủ tục cửa sổ. Trị trả về nằm
trong phạm vi của thông điệp WM_NCHITTEST mà GetMessage() gởi cho thủ tục
cửa sổ của ta. WM_NCHITTEST là thông điệp đến đầ
u tiên trong hàng loạt thông
điệp mà mouse phát ra. Nó yêu cầu thủ tục cửa sổ nhận diện vị trí cursor. Đa số
chương trình chuyển thông điệp này cho DefWindowProc() lo tìm vị trí cursor và
cung cấp một hit-test code như là trị trả về.
Báo Cáo Luận Văn Tốt Nghiệp Trang 20

Khi DefWindowProc() trả về kết quả khác HTCLIENT, HTERROR,
HTNOWHERE, HTTRANSPARENT thì cursor nằm trên vùng non-client thì
Windows sẽ phát đi thông điệp non-client.
Còn khi DefWindows trả về kết quả HTCLIENT thì cursor nằm trên vùng
client và những thông điệp do Windows phát đi lúc này thì sẽ được trình ứng dụng
xử lý.
Hàm SendMessage() sẽ sử dụng mã hit-test code để quyết định xem loại thông
điệp chuột nào mà cho phát sinh. Khi hit-test code bằng HTCLIENT thì một thông
điệp vùng client sẽ được phát sinh còn tất cả các hit-test code khác sẽ phát sinh ra
những thông điệp chuột vùng non-client.
Trước khi SendMessage() trả về một thông điệp chuột cho chương trình của ta
thì có một việc mà hàm này phải thi hành: nó phải bảo đảm là hình dáng cursor phù
hợp vị trí hiện thời của mouse. Muốn thế nó phải gởi đi một thông điệp khác cho
thủ tục cửa sổ WM_GETCURSOR. Tương tự như thông điệp WM_NCHITTEST

ở 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.
Báo Cáo Luận Văn Tốt Nghiệp Trang 22

Chương 2:
T
T
Ì
Ì
M
M

H
H
I
I

Hook là một cơ chế cực mạnh cho phép ta cài đặt một thủ tục để điều khiển hoặc
chận hứng các thông điệp trước khi các thông điệp này tới được nơi tiếp nhận.
Hay nói một cách khác hook là một điểm trong kỹ thuật message-handling hệ
thống, nơi mà một ứng dụng có thể đặt một thủ tục để quản lý sự lưu thông của các
thông điệp trong hệ thống và xử lý một kiểu thông báo nào đó trước khi chúng tới
được thủ tục cửa sổ đích.
Do có khả năng can thiệp mạnh nên hook có xu hướng làm chậm lại hệ thống
vì chúng làm tăng s
ố lượng các hoạt động của hệ thống đối với mỗi thông điệp. Chỉ
đặt hook khi thực sự cần thiết và dỡ bỏ chúng khi không cần đến.
1 - Chuỗi hook:

Hệ thống cho phép nhiều kiểu hook khác nhau: mỗi kiểu cung cấp việc truy
xuất tới một khía cạnh khác nhau của kỹ thuật message-handling. Chẳng hạn, một
ứng dụng có thể sử dụng hook WM_MOUSE để quản lý những thông điệp chuột
trong luồng thông điệp.
Hệ thống duy trì một chuỗi hook riêng lẻ đối với mỗi kiểu hook. Một chuỗi
hook là một danh sách các pointer chỉ tới các hàm callback application-defined đặc
biệt mà những hàm này gọi các thủ tục hook. Khi một thông điệp xảy ra là nó đã
được tổ chức với một kiểu hook cụ thể, hệ thống chuyển thông điệp tới mỗi thủ tục
hook có mặt trong chuỗi hook, theo trật tự cái nọ sau cái kia. Hoạt động của một thủ
tục hook có thể phụ thuộc vào kiểu hook mà nó liên quan. Các thủ tục hook cho một
vài kiểu hook có thể chỉ qu
ản lý những thông điệp; những cái khác có thể thay đổi
những thông điệp hay dừng sự phát triển của nó trong chuỗi, ngăn chặn chúng tìm
tới thủ tục hook kế tiếp hay cửa sổ cuối cùng (đích).
2 – Thủ tục hook:

Để có được sự tiện lợi của một loại hook chi tiết, người lập trình cung cấp một
thủ tục hook và sử dụng hàm SetWindowsHookEx để đặt nó vào trong chuỗi hook.

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ỉ sử
dụng hook tồn cục cho mục đích debug còn không thì nên tránh không sử dụng.
Hook tồn cục có thể gây tổn hại cho hoạt động của hệ thống và gây nên xung đột
với những ứng dụng khác có cùng kiểu hook tồn cục.
3 – Các loại hook:

Một loại hook làm cho một ứng dụng có thể quản lý một mặt khác nhau của kỹ
thuật message-handling hệ thống.
Bao gồm các loại hook sau đây:
- WH_CALLWNDPROC hook quản lý các thông điệp trước lúc hệ thống
gởi chúng tới cửa sổ đích.
- WH_CALLWNDPROCRET hook quản lý các thông điệp sau khi chúng
được xử lý bởi thủ tục cửa sổ đích.
- WH_CBT hook nhận những thông báo có ích tới ứng dụng huấn luyện
trên cơ sở tính tốn (CBT).
- WH_DEBUG hook có ích cho việc debug những thủ tục hook khác.
- WH_FOREGROUNDIDLE hook sẽ được gọi khi thread foreground của
ứng dụng sẽ trở thành không dùng đến. Hook này có ích cho hoạt động những
nhiệm vụ (task) độ ưu tiên thấp trong thời gian không được dùng đến.
- WH_GETMESSAGE hook quản lý các thông điệp được post tới hàng
thông điệp.

Trích đoạn Phân tích vấn đề: Giới thiệu một số hàm cĩ liên quan: Giới thiệu một số cấu trúc dữ liệu cĩ liên quan:
Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status