Các hàm API liên quan đến cửa sổ

Các hàm API liên quan đến cửa sổ  
Trước khi tìm hiểu tiếp phần tiếp theo của API, tôi xin phép được gửi tới các bạn công dụng của  
các hàm API thông dụng, sau đó chúng ta sẽ tiếp tục nghiên cứu cách sử dụng nó.  
Phần 1: Các hàm API liên quan đến cửa sổ  
Để xem xét quan hệ của một cửa sổ (Tạm gọi là cửa sổ khai báo) với các cửa sổ khác ta nghiên  
cứu các mối quan hệ sau:  
1.  
Declare Function AnyPopup Lib "user32" Alias "AnyPopup" () As Long  
Công dụng: Đưa ra chỉ số cửa sổ popup hiện đang tồn tại trên màn hình.  
Trị trả về: Integer ~ True (Khác zero) nếu có cửa sổ popup.  
2.  
Declare Function AdjustWindowRect Lib "user32" Alias "AdjustWindowRect" (lpRect As  
RECT, ByVal dwStyle As Long, ByVal bMenu As Long) As Long  
Declare Function AdjustWindowRectEx Lib "user32" Alias "AdjustWindowRectEx" (lpRect  
As RECT, ByVal dsStyle As Long, ByVal bMenu As Long, ByVal dwEsStyle As Long) As  
Long  
3.  
Công dụng: Điều chỉnh cửa sổ khi có vùng làm việc client (Không tính kích thước của thanh tiêu  
đề, đường viền và các phần thêm) được khai báo, khi biết kiểu cửa sổ.  
Tham số kèm:  
LpRect Hình chữ nhật chứa vùng làm việc client.  
DwStyle  
BMenu Đưa giá trị True (Khác zero) nếu cửa sổ có trình đơn  
DwEsStyle kiểu cửa sổ mở rộng.  
4.  
Kiểu cửa sổ.  
Declare Function ArrangeIconicWindows Lib "user32" Alias "ArrangeIconicWindows" (ByVal  
hwnd As Long) As Long  
Công dụng: Xếp các biểu tượng cửa sổ trong một cửa sổ chứa (Mức Parent).  
Trị trả về: Integer chiều cao của hàng biểu tượng. Zero nếu thất bại.  
Tham số kèm:  
HWnd  
5.  
Cán của cửa sổ chứa (Mức Parent).  
Declare Function BeginDeferWindowPos Lib "user32" Alias "BeginDeferWindowPos"  
(ByVal nNumWindows As Long) As Long  
Công dụng: Bắt đầu xây dựng danh sách vị trí các cửa sổ mới thành cấu trúc bản đồ nội bộ  
chứa vị trí các cửa sổ.  
Trị trả về: Integer - cán của cấu trúc bản đồ. Zero nếu thất bại.  
Tham số kèm:  
NNum Windows Số cửa sổ ban đầu để cấp phát chỗ trống.  
6.  
Declare Function DeferWindowPos Lib "user32" Alias "DeferWindowPos" (ByVal  
hWinPosInfo As Long, ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As  
Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As  
Long  
Công dụng: Đinh nghĩa vị trí của cửa sổ mới qua cửa sổ khai báo và đưa vào cấu trúc bản đồ  
nội bộ chứa vị trí các cửa sổ.  
Trị trả về: Integer - Cán mới đối với cấu trúc bản đồ chứa thông tin cập nhật vị trí. Zero nếu thất  
bại.  
Tham số kèm:  
HWinPosInfo Cán của cấu trúc bản đồ.  
HWnd Cửa sổ cần định vị.  
HWndInsertAfter  
Cán cửa sổ mà cửa sổ hWnd đặt sau nó trong danh sách. Nó có thể là  
một trong các hằng sau:  
HWnd_BOTTOM: Đặt về cuối danh sách.  
HWnd_TOP: Đặt cửa sổ ở đầu danh sách  
HWnd_TPMOST: Đặt cửa sổ ở đầu danh sách lên trên cùng nhìn thấy được.  
Hoành độ của cửa sổ hWnd theo toạ độ của cửa sổ chứa (Mức Parent) nó.  
Tung độ của cửa sổ hWnd theo toạ độ cửa sổ chứa (Mức Parent) nó.  
Chiều rộng cửa sổ mới.  
X
Y
cx  
cy  
Chiều cao cửa sổ mới.  
Flags Một số nguyên là một trong các hằng sau:  
SWP_DRAWFRAME: Vẽ khung bao quanh cửa sổ.  
SWp-HIDEWINDOW: Giấu cửa sổ.  
SWP_NOACTIVE: Không kích hoạt cửa sổ.  
SWP_NOMOVE: Giữ nguyên vị trí hiện tại.  
SWP_NOREDRAW: Không vẽ lại tự động.  
SWp_NOSIZE: Giữ nguyên kích thước.  
SWp_NOZORDER: Giữ nguyên vị trí hiện hành trong danh sách.  
7. Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long,  
ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal  
cy As Long, ByVal wFlags As Long) As Long  
Công dụng: Thiết đặt vị trí và trạng thái cửa sổ.  
Tham số kèm:  
HWnd Cán của cửa sổ cần định vị  
HWndInsertAfter Như hàm trên.  
8.  
Declare Function EndDeferWindowPos Lib "user32" Alias "EndDeferWindowPos" (ByVal  
hWinPosInfo As Long) As Long  
Công dụng: Cập nhật các vị trí và tình trạng của tất cả các cửa sổ.  
Tham số kèm:  
HWinPosInfo Cán của cấu trúc bản đồ lấy từ lệnh DerefWindowPos gần nhất.  
9.  
Declare Function BringWindowToTop Lib "user32" Alias "BringWindowToTop" (ByVal hwnd  
As Long) As Long  
Công dụng: Chuyển cửa sổ lên đầu danh sách làm lộ ra nếu bị khuất.  
Tham số kèm:  
HWnd  
Cán của cửa sổ cần tác động.  
10. Declare Function ChildWindowFromPoint Lib "user32" Alias "ChildWindowFromPoint" (ByVal  
hWnd As Long, ByVal xPoint As Long, ByVal yPoint As Long) As Long  
11. Declare Function ChildWindowFromPoint Lib "user32" Alias "ChildWindowFromPoint" (ByVal  
hWndParent As Long, ByVal pt As POINTAPI) As Long  
Công dụng: Lấy cán của cửa sổ con (Mức Child) khi đưa điểm của cửa sổ chứa (Mức Parent)  
nó.  
Trị trả về: Integer - Cán của cửa sổ con (Mức Child) đầu tiên thoả mãn. Nếu không thấy cửa sổ  
con (Mức Child) nào trả về cán của cửa sổ chứa (Mức Parent). Zero nếu điểm nằm ngoài cửa sổ  
chứa (Mức Parent).  
Tham số kèm:  
HWnd Cán của cửa sổ chứa (Mức Parent).  
Pt  
Trị của điểm.  
XPoint Hoành độ của điểm.  
YPoint Tung độ của điểm.  
12. Declare Function ClientToScreen Lib "user32" Alias "ClientToScreen" (ByVal hwnd As Long,  
lpPoint As POINTAPI) As Long  
Công dụng: Chuyển toạ độ theo cửa sổ sang toạ độ theo màn hình.  
Tham số kèm:  
HWnd Cán của cửa sổ làm căn cứ xác định toạ độ.  
LpPoint Ddieemr tính theo toạ độ cửa sổ  
1.  
Declare Function CloseWindow Lib "user32" Alias "CloseWindow" (ByVal  
hwnd As Long) As Long  
Công dụng: Thu nhỏ cửa sổ.  
Tham số kèm:  
HWnd Cán của cửa sổ cần thu.  
2.  
Declare Function CopyRect Lib "user32" Alias "CopyRect" (lpDestRect As RECT,  
lpSourceRect As RECT) As Long  
Công dụng: Sao nội dung hình chữ nhật.  
Tham số kèm:  
lpDestRect  
LpSourceRect  
Hình chữ nhật đích sẽ nhận kết quả.  
Hình chữ nhật nguồn bị copy.  
3.  
Declare Function DestroyWindow Lib "user32" Alias "DestroyWindow" (ByVal hwnd As  
Long) As Long  
Công dụng: Phá huỷ cửa sổ (Kể cả các cửa sổ con (Mức Child) của nó).  
Trị trả về: Integer khác 0 sẽ thành công. Zero nếu thất bại.  
Tham số kèm:  
HWnd Cán của cửa sổ sẽ phá huỷ.  
4.  
Declare Function EnableWindow Lib "user32" Alias "EnableWindow" (ByVal hwnd As Long,  
ByVal fEnable As Long) As Long  
Công dụng: Cho hiệu lực hay vô hiệu hoá mọi dữ liệu nhập vào cửa sổ từ bàn phím hoặc chuột.  
Trị trả về: Integer True (Khác zero) nếu trước đó cửa sổ được phép. Zero nếu bị vô hiệu hoá.  
Tham số kèm:  
HWnd Cán của cửa sổ  
FEnable  
Giá trị logic. Nếu là True, thì Window sẽ có hiệu lực Enable. Còn False, sẽ không  
có hiệu lực Disable.  
Declare Function EnumChildWindows Lib "user32" Alias "EnumChildWindows" (ByVal  
hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long  
Công dụng: Liệt kê các cửa sổ con (Mức Child) của một cửa sổ chứa (Mức Parent). Phải có  
Custom Control CBK.VBX mới sử dụng được.  
Trị trả về: Integer True (Khác zero) nếu thành công. Zero nếu thất bại.  
Tham số kèm:  
HWndParent Cán của cửa sổ chứa (Mức Parent) cần liệt kê  
LpEnumFunc Biến trỏ chỉ đến hàm để gọi đối với mỗi cửa sổ con (Mức Child). Sử dụng tính  
chất ProcAddress của Custon Control CBK.VBX để nhận hàm biến trỏ (function pointer) để gọi lại  
(callbacks).  
LParam  
Trị chuyển đến cho sự kiện EnumWindows của Custom Control trong lúc liệt kê.  
Ý nghĩa của trị này do lập trình viên xác định.  
5.  
Declare Function EnumWindowStations Lib "user32" Alias "EnumWindowStationsA" (ByVal  
lpEnumFunc As Long, ByVal lParam As Long) As Long  
Công dụng: Liệt kê danh sách cửa sổ cấp trên, chứa cửa sổ khai báo. Phải có Custom Control  
CBK.VBX mới sử dụng được.  
Trị trả về: Integer True (Khác zero) nếu thành công.  
Tham số kèm:  
LpEnumFunc  
Biến trỏ chỉ đến hàm để gọi đối với mỗi cửa sổ con (Mức Child). Sử  
dụng tính chất ProcAddress của Custon Control CBK.VBX để nhận hàm biến trỏ (function  
pointer) để gọi lại (callbacks)  
LParamTrị chuyển đến cho sự kiện EnumWindows của Custom Control trong lúc liệt kê. Ý nghĩa  
của trị này do lập trình viên xác định.  
6.  
Declare Function EqualRect Lib "user32" Alias "EqualRect" (lpRect1 As RECT, lpRect2 As  
RECT) As Long  
Công dụng: So sánh 2 cấu trúc hình chữ nhật.  
Trị trả về: Integer True (Khác zero) Nếu các toạ độ góc trái trên và góc phải dưới của 2 hình  
bằng nhau. Zero nếu khác.  
Tham số kèm:  
LpRec1, lpRec2:  
Hai hình chữ nhật cần so sánh.  
7.  
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As  
String, ByVal lpWindowName As String) As Long  
Công dụng: Tìm cửa sổ đầu tiên trong danh sách cửa sổ thoả mãn điều kiện.  
Trị trả về: Integer - Cán của cửa sổ thoả mãn. Zero nếu không có cửa sổ nào.  
Tham số kèm:  
LpClassName Biến trỏ chỉ đến chuỗi kết thúc bằng null chứa tên lớp đối tượng đối với cửa sổ.  
Nếu bằng zero chấp nhận bất cứ lớp nào.  
LpWindowName  
Biến trỏ chỉ đến chuỗi kết thúc bằng null chứa tên tiêu đề cửa sổ. Nếu  
bằng 0, chấp nhận bất cứ tiêu đề nào.  
8.  
Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As  
Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long  
Công dụng: Tìm cửa sổ đầu tiên trong danh sách cửa sổ thoả mãn điều kiện.  
Trị trả về: Integer - Cán của cửa sổ thoả mãn. Zero nếu không có cửa sổ nào.  
Tham số kèm:  
hwndParent  
Cán cuả cửa sổ chứa (Cấp Parent) có các cửa sổ con để tìm.  
Nếu hwndParent là NULL, hàm sẽ sử dụng desktop như cửa sổ chứa parent. Hàm sẽ  
tìm trong số các cửa sổ là cửa sổ con (Cấp Child) của desktop.  
Windows 2000 trở lên: Nếu hwndParent là HWND_MESSAGE, hàm sẽ tìm tất cả cửa  
sổ dạng message-only windows.  
hwndChildAfter  
Là cán của cửa sổ con (cấp child). Tìm kiếm bắt đầu từ cửa sổ con kế tiếp theo thứ tự  
trục Z. Cửa sổ con phải là một cấp kế tiếp của hwndParent, không thể cấp thấp hơn.  
Nếu hwndChildAfter là NULL, tìm kiếm sẽ bắt đầu với cửa sổ con đầu tiên(Cấp child) của  
hwndParent.  
Nhớ rằng nếu cả hai hwndParent và hwndChildAfter là NULL, hàm sẽ tìm tất cả mức top  
của dạng message-only windows.  
lpszClass  
Lớp cần tìm kiếm.  
lpszWindow  
Tiêu đề của cửa sổ cần tìm. Nếu là NULL, Tìm tất cả.  
Declare Function FlashWindow Lib "user32" Alias "FlashWindow" (ByVal hwnd As Long,  
ByVal bInvert As Long) As Long  
9.  
Công dụng: Chiếu sáng cử sổ, ngay cả khi nó chưa được kích hoạt (inactive)  
Trị trả về: Integer True (Khác zero) nếu cửa sổ đã được kích hoạt trước khi gọi.  
Tham số kèm:  
HWnd Cán của cửa sổ cần chiếu sáng.  
BInvert Integer - True (Khác zero) nếu bật, False để quay lại trạng thái trước  
10. Declare Function GetActiveWindow Lib "user32" Alias "GetActiveWindow" () As Long  
Công dụng: Nhận cán của cửa sổ đang kích hoạt.  
Trị trả về: Integer - Cán của cửa sổ đang kích hoạt. Zero nếu không có.  
11. Declare Function GetClassInfo Lib "user32" Alias "GetClassInfoA" (ByVal hInstance As Long,  
ByVal lpClassName As String, lpWndClass As WNDCLASS) As Long  
Công dụng: Nhận bản sao cấu trúc Wndclass chứa thông tin về lớp khai báo.  
Trị trả về: Integer - True (Khác zero) khi thành công. Zero nếu không thấy lớp thoả mãn.  
Tham số kèm:  
hInstance  
Cán của đối tượng sở hữu lớp. Dùng NULL để nhận thông tin về các lớp  
Windows chuẩn.  
LpClassName Tên của lớp cần tìm. Có thể dùng ID resource.  
LpWndClass WndCLASS - Cấu trúc để chứa kết quả.  
12. Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (ByVal hwnd As Long,  
ByVal nIndex As Long) As Long  
Công dụng: Lấy thông tin lớp.  
Trị trả về: Tuỳ theo yêu cầu.  
Tham số kèm:  
HWnd Cán của cửa sổ để nhận thông tin đối với lớp chứa nó.  
NIndex Thông tin cần nhận. Nếu là GLC_MENUNAME lấy tên hay resource ID đối với trình đơn  
của lớp. Nếu là GLC_WNDPROC để nhận vị trí của hàm cửa sổ lớp (Hàm đờ phôn đối với các  
cửa sổ trong lớp).  
Declare Function CloseWindow Lib "user32" Alias "CloseWindow" (ByVal hwnd As Long) As  
Long  
Công dụng: Thu nhỏ cửa sổ.  
Tham số kèm:  
HWnd Cán của cửa sổ cần thu.  
2.  
Declare Function CopyRect Lib "user32" Alias "CopyRect" (lpDestRect As RECT,  
lpSourceRect As RECT) As Long  
Công dụng: Sao nội dung hình chữ nhật.  
Tham số kèm:  
lpDestRect  
LpSourceRect  
Hình chữ nhật đích sẽ nhận kết quả.  
Hình chữ nhật nguồn bị copy.  
3.  
Declare Function DestroyWindow Lib "user32" Alias "DestroyWindow" (ByVal hwnd As  
Long) As Long  
Công dụng: Phá huỷ cửa sổ (Kể cả các cửa sổ con (Mức Child) của nó).  
Trị trả về: Integer khác 0 sẽ thành công. Zero nếu thất bại.  
Tham số kèm:  
HWnd Cán của cửa sổ sẽ phá huỷ.  
4.  
Declare Function EnableWindow Lib "user32" Alias "EnableWindow" (ByVal hwnd As Long,  
ByVal fEnable As Long) As Long  
Công dụng: Cho hiệu lực hay vô hiệu hoá mọi dữ liệu nhập vào cửa sổ từ bàn phím hoặc chuột.  
Trị trả về: Integer True (Khác zero) nếu trước đó cửa sổ được phép. Zero nếu bị vô hiệu hoá.  
Tham số kèm:  
HWnd Cán của cửa sổ  
FEnable  
Giá trị logic. Nếu là True, thì Window sẽ có hiệu lực Enable. Còn False, sẽ không  
có hiệu lực Disable.  
Declare Function EnumChildWindows Lib "user32" Alias "EnumChildWindows" (ByVal  
hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long  
Công dụng: Liệt kê các cửa sổ con (Mức Child) của một cửa sổ chứa (Mức Parent). Phải có  
Custom Control CBK.VBX mới sử dụng được.  
Trị trả về: Integer True (Khác zero) nếu thành công. Zero nếu thất bại.  
Tham số kèm:  
HWndParent Cán của cửa sổ chứa (Mức Parent) cần liệt kê  
LpEnumFunc Biến trỏ chỉ đến hàm để gọi đối với mỗi cửa sổ con (Mức Child). Sử dụng tính  
chất ProcAddress của Custon Control CBK.VBX để nhận hàm biến trỏ (function pointer) để gọi lại  
(callbacks).  
LParam  
Trị chuyển đến cho sự kiện EnumWindows của Custom Control trong lúc liệt kê.  
Ý nghĩa của trị này do lập trình viên xác định.  
5.  
Declare Function EnumWindowStations Lib "user32" Alias "EnumWindowStationsA" (ByVal  
lpEnumFunc As Long, ByVal lParam As Long) As Long  
Công dụng: Liệt kê danh sách cửa sổ cấp trên, chứa cửa sổ khai báo. Phải có Custom Control  
CBK.VBX mới sử dụng được.  
Trị trả về: Integer True (Khác zero) nếu thành công.  
Tham số kèm:  
LpEnumFunc  
Biến trỏ chỉ đến hàm để gọi đối với mỗi cửa sổ con (Mức Child). Sử  
dụng tính chất ProcAddress của Custon Control CBK.VBX để nhận hàm biến trỏ (function  
pointer) để gọi lại (callbacks)  
LParamTrị chuyển đến cho sự kiện EnumWindows của Custom Control trong lúc liệt kê. Ý nghĩa  
của trị này do lập trình viên xác định.  
6.  
Declare Function EqualRect Lib "user32" Alias "EqualRect" (lpRect1 As RECT, lpRect2 As  
RECT) As Long  
Công dụng: So sánh 2 cấu trúc hình chữ nhật.  
Trị trả về: Integer True (Khác zero) Nếu các toạ độ góc trái trên và góc phải dưới của 2 hình  
bằng nhau. Zero nếu khác.  
Tham số kèm:  
LpRec1, lpRec2:  
Hai hình chữ nhật cần so sánh.  
7.  
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As  
String, ByVal lpWindowName As String) As Long  
Công dụng: Tìm cửa sổ đầu tiên trong danh sách cửa sổ thoả mãn điều kiện.  
Trị trả về: Integer - Cán của cửa sổ thoả mãn. Zero nếu không có cửa sổ nào.  
Tham số kèm:  
LpClassName Biến trỏ chỉ đến chuỗi kết thúc bằng null chứa tên lớp đối tượng đối với cửa sổ.  
Nếu bằng zero chấp nhận bất cứ lớp nào.  
LpWindowName  
Biến trỏ chỉ đến chuỗi kết thúc bằng null chứa tên tiêu đề cửa sổ. Nếu  
bằng 0, chấp nhận bất cứ tiêu đề nào.  
8.  
Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As  
Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long  
Công dụng: Tìm cửa sổ đầu tiên trong danh sách cửa sổ thoả mãn điều kiện.  
Trị trả về: Integer - Cán của cửa sổ thoả mãn. Zero nếu không có cửa sổ nào.  
Tham số kèm:  
hwndParent  
Cán cuả cửa sổ chứa (Cấp Parent) có các cửa sổ con để tìm.  
Nếu hwndParent là NULL, hàm sẽ sử dụng desktop như cửa sổ chứa parent. Hàm sẽ  
tìm trong số các cửa sổ là cửa sổ con (Cấp Child) của desktop.  
Windows 2000 trở lên: Nếu hwndParent là HWND_MESSAGE, hàm sẽ tìm tất cả cửa  
sổ dạng message-only windows.  
hwndChildAfter  
Là cán của cửa sổ con (cấp child). Tìm kiếm bắt đầu từ cửa sổ con kế tiếp theo thứ tự  
trục Z. Cửa sổ con phải là một cấp kế tiếp của hwndParent, không thể cấp thấp hơn.  
Nếu hwndChildAfter là NULL, tìm kiếm sẽ bắt đầu với cửa sổ con đầu tiên(Cấp child) của  
hwndParent.  
Nhớ rằng nếu cả hai hwndParent và hwndChildAfter là NULL, hàm sẽ tìm tất cả mức top  
của dạng message-only windows.  
lpszClass  
Lớp cần tìm kiếm.  
lpszWindow  
Tiêu đề của cửa sổ cần tìm. Nếu là NULL, Tìm tất cả.  
Declare Function FlashWindow Lib "user32" Alias "FlashWindow" (ByVal hwnd As Long,  
ByVal bInvert As Long) As Long  
9.  
Công dụng: Chiếu sáng cử sổ, ngay cả khi nó chưa được kích hoạt (inactive)  
Trị trả về: Integer True (Khác zero) nếu cửa sổ đã được kích hoạt trước khi gọi.  
Tham số kèm:  
HWnd Cán của cửa sổ cần chiếu sáng.  
BInvert Integer - True (Khác zero) nếu bật, False để quay lại trạng thái trước  
10. Declare Function GetActiveWindow Lib "user32" Alias "GetActiveWindow" () As Long  
Công dụng: Nhận cán của cửa sổ đang kích hoạt.  
Trị trả về: Integer - Cán của cửa sổ đang kích hoạt. Zero nếu không có.  
11. Declare Function GetClassInfo Lib "user32" Alias "GetClassInfoA" (ByVal hInstance As Long,  
ByVal lpClassName As String, lpWndClass As WNDCLASS) As Long  
Công dụng: Nhận bản sao cấu trúc Wndclass chứa thông tin về lớp khai báo.  
Trị trả về: Integer - True (Khác zero) khi thành công. Zero nếu không thấy lớp thoả mãn.  
Tham số kèm:  
hInstance  
Cán của đối tượng sở hữu lớp. Dùng NULL để nhận thông tin về các lớp  
Windows chuẩn.  
LpClassName Tên của lớp cần tìm. Có thể dùng ID resource.  
LpWndClass WndCLASS - Cấu trúc để chứa kết quả.  
12. Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (ByVal hwnd As Long,  
ByVal nIndex As Long) As Long  
Công dụng: Lấy thông tin lớp.  
Trị trả về: Tuỳ theo yêu cầu.  
Tham số kèm:  
HWnd Cán của cửa sổ để nhận thông tin đối với lớp chứa nó.  
NIndex Thông tin cần nhận. Nếu là GLC_MENUNAME lấy tên hay resource ID đối với trình đơn  
của lớp. Nếu là GLC_WNDPROC để nhận vị trí của hàm cửa sổ lớp (Hàm đờ phôn đối với các  
cửa sổ trong lớp).  
.
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As  
Long, ByVal nIndex As Long) As Long  
Công dụng: Lấy thông tin từ cấu trúc cửa sổ.  
Trị trả về: Theo yêu cầu.  
Tham số kèm:  
HWnd Cán của cửa sổ cần lấy thông tin.  
NIndex Thông tin cần lấy, tuỳ thuộc vào các hằng sau:  
GWL_EXSTYLE: Kiểu cửa sổ mở rộng.  
GWL_STYLE: Kiểu cửa sổ.  
GWL_WNDPROC: Vị trí của hàm xử lý cửa sổ này.  
DWL_MSGRESULT: Trị được trả về bởi thông báo bên trong hàm đối thoại.  
DWL_DLGPROC: Vị trí của hàm xử lý khung đối thoại đối với cửa sổ này.  
DWL_USER: Được định nghĩa bởi ứng dụng.  
2.  
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As  
Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long  
Công dụng: Thiết đặt thông tin trong cấu trúc cửa sổ.  
Trị trả về: Integer - Trị trước đó của dữ kiện cần đặt giá trị.  
Tham số kèm:  
HWnd Cán của cửa sổ để đặt thông tin.  
NIndex Thông tin cần đặt. Xem hàm trên.  
DwNewLong  
Trị mới cần đặt.  
3.  
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As  
Long, ByVal lpString As String, ByVal cch As Long) As Long  
Công dụng: Lấy tiêu đề của cửa sổ hay nội dung của ô điều khiển.  
Trị trả về: Integer - chiều dài chuỗi được lấy không tính ký tự null đứng cuối.  
Tham số kèm:  
HWnd Cán của cửa sổ cần lấy.  
LpString  
Biến lưu kết quả là tên chuỗi cần lấy. Phải khai báo tối thiểu aint+1. Dùng công  
thức sau lấy tên chuỗi: Chuỗi = Left (lpString, len (trim(lpString)).  
Aint  
4.  
Chiều dài chuỗi lpString  
Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA"  
(ByVal hwnd As Long) As Long  
Công dụng: Lấy chiều dài của tiêu đề cửa sổ hay nội dung của một ô điều khiển.  
Trị trả về: Chiều dài chuỗi cửa sổ..  
Tham số kèm:  
HWnd Cán của cửa sổ cần lấy.  
5.  
Declare Function GetWindowWord Lib "user32" Alias "GetWindowWord" (ByVal hwnd As  
Long, ByVal nIndex As Long) As Integer  
Công dụng: Lấy thông tin từ cấu trúc của cửa sổ chỉ định.  
Trị trả về: Theo yêu cầu.  
Tham số kèm:  
HWnd Cán của cửa sổ cần lấy.  
NIndex Thông tin cần lấy, phụ thuộc vào một trong các hằng:  
GWW_HINSTANCE: Cán của chủ cửa sổ.  
GWW_HWNDPARENT: Cán cửa sổ chứa (Mức Parent) nó.  
GWW_ID: Số ID của cửa sổ con (Mức Child) bên trong khung đối thoại.  
6.  
Declare Function SetWindowWord Lib "user32" Alias "SetWindowWord" (ByVal hwnd  
As Long, ByVal nIndex As Long, ByVal wNewWord As Long) As Long  
Công dụng: Đặt thông tin trong cấu trúc cửa sổ.  
Trị trả về: Integer - Trị trước khi đặt của dữ liệu cần thay.  
Tham số kèm:  
HWnd Cán của cửa sổ cần đặt.  
NIndex Như hàm trên.  
DwNewWord - Trị mới cần đặt.  
7.  
Declare Function InflateRect Lib "user32" Alias "InflateRect" (lpRect As RECT, ByVal x As  
Long, ByVal y As Long) As Long  
Công dụng: Thay đổi kích thước của hình chữ nhật.  
Tham số kèm:  
LpRect Cấu trúc hình chữ nhật cần điều chỉnh  
X
Y
8.  
Chiều rộng được tăng lên hay giảm đi.  
Chiều cao tăng lên hay giảm đi.  
Declare Function IntersectRect Lib "user32" Alias "IntersectRect" (lpDestRect As RECT,  
lpSrc1Rect As RECT, lpSrc2Rect As RECT) As Long  
Công dụng: Nạp vào hình chữ nhật đích phần chung của 2 hình chữ nhật đơn.  
Trị trả về: Integer (Khác zero)- Nếu hình chữ nhật đích không rỗng. Zero nếu rỗng.  
Tham số kèm:  
LpDestRect - Hình chữ nhật đích.  
LpScr1Rect, lpSrc2Rect: Hai hình chữ nhật giao nhau.  
9.  
Declare Function InvalidateRect Lib "user32" Alias "InvalidateRect" (ByVal hwnd As Long,  
lpRect As RECT, ByVal bErase As Long) As Long  
Công dụng: Làm sai bất hợp lệ tất cả hay một phần vùng làm việc của một cửa sổ. Để vẽ lại  
đúng lúc, đúng chỗ.  
Tham số kèm:  
HWnd Cán của cửa sổ cần làm mất hợp lệ.  
LpRect hình chữ nhật mô tả phần không hợp lệ.  
BErase Cho về True (Khác zero) để xoá vùng chỉ định trước khi vẽ lại.  
10. Declare Function IsChild Lib "user32" Alias "IsChild" (ByVal hWndParent As Long, ByVal  
hwnd As Long) As Long  
Công dụng: Xác định cửa sổ cần xét có phải cửa sổ con (Mức Child) thuộc nhánh cửa sổ khác.  
Trị trả về: Integer - True (Khác zero) nếu HWnd là cửa sổ con (Mức Child) hay hậu duệ của  
HWndParent Tham số kèm:  
HWnd Cán của cửa sổ cần kiểm tra  
HWndParent Cán của cửa sổ chứa (Mức Parent).  
11. Declare Function IsIconic Lib "user32" Alias "IsIconic" (ByVal hwnd As Long) As Long  
Công dụng: Kiểm tra cửa sổ có phải đã thu nhỏ thành biểu tượng không.  
Trị trả về: Integer - True (Khác zero) nếu bị thu nhỏ  
Tham số kèm:  
HWnd Cán của cửa sổ cần kiểm tra.  
12. Declare Function IsRectEmpty Lib "user32" Alias "IsRectEmpty" (lpRect As RECT) As Long  
Công dụng: Kiểm tra xem hình chữ nhật có rỗng không.  
Trị trả về: Integer - True (Khác zero) nếu rỗng. Zero nếu không rỗng.  
Tham số kèm:  
LpRect  
Hình chữ nhật cần kiểm tra.  
1. Declare Function IsWindow Lib "user32" Alias "IsWindow" (ByVal hwnd As Long) As Long  
Công dụng: Xác định xem có phải là cán cửa sổ không.  
Trị trả về: Integer - True (Khác zero) nếu đúng là cán cửa sổ.  
Tham số kèm:  
HWnd Cán cần kiểm tra.  
2.  
Declare Function IsWindowEnabled Lib "user32" Alias "IsWindowEnabled" (ByVal hwnd As  
Long) As Long  
Công dụng: Kiểm tra cửa sổ có hiệu lực (enabled) không.  
Trị trả về: Integer - True (Khác zero) nếu có hiệu lực.  
Tham số kèm:  
HWnd Cán của cửa sổ cần kiểm tra  
3.  
Declare Function IsWindowVisible Lib "user32" Alias "IsWindowVisible" (ByVal hwnd As  
Long) As Long  
Công dụng: Kiểm tra xem cửa sổ xem có thể nhìn thấy nó trên màn hình, kể cả cửa sổ bị cửa sổ  
khác xếp chồng lên trên.  
Trị trả về: Integer - True (Khác zero) nếu nhìn thấy được.  
Tham số kèm:  
HWnd Cán của cửa sổ cần kiểm tra.  
4.  
Declare Function IsZoomed Lib "user32" Alias "IsZoomed" (ByVal hwnd As Long) As Long  
Công dụng: Kiểm tra xem cửa sổ xem có phóng to toàn màn hình không.  
Trị trả về: Integer - True (Khác zero) nếu phóng toàn màn hình.  
Tham số kèm:  
HWnd Cán của cửa sổ cần kiểm tra.  
5.  
Declare Function LockWindowUpdate Lib "user32" Alias "LockWindowUpdate" (ByVal  
hwndLock As Long) As Long  
Công dụng: Khoá cửa sổ, không cho cập nhật. Mỗi lần chỉ có 1 cửa sổ bị khoá.  
Trị trả về: Integer - True (Khác zero) nếu thành công. Zero nếu đã có cửa sổ khác bị khoá.  
Tham số kèm:  
HWndLock Cán của cửa sổ cần khoá.  
6.  
Declare Function MapWindowPoints Lib "user32" Alias "MapWindowPoints" (ByVal  
hwndFrom As Long, ByVal hwndTo As Long, lppt As Any, ByVal cPoints As Long) As Long  
Công dụng: Chuyển đổi các điểm theo các toạ độ sử dụng (client) của một cửa sổ sang các toạ  
độ cuả cửa sổ khác.  
Tham số kèm:  
HWndFrom, HWndTo Cán của cửa sổ nguồn và đích. Nếu một cán là toạ độ theo màn hình thì  
chọn cán là cán của Desktop.  
Lppt  
Điểm chốt POINTAPI của mảng chuyển đổi.  
CPointsSố điểm chuyển đổi.  
7.  
Declare Function MoveWindow Lib "user32" Alias "MoveWindow" (ByVal hwnd As Long,  
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal  
bRepaint As Long) As Long  
Công dụng: Di chuyển và định lại kích thước cửa sổ.  
Tham số kèm:  
HWnd Cán của cửa sổ cần di chuyển.  
X,y  
Toạ độ mới của đỉnh trái cửa sổ.  
NWidth, nHeight  
BRepaint  
Chiều rộng và chiều cao mới của cửa sổ.  
Integer - True (Khác zero) nếu muốn cửa sổ vẽ lại tự động sau khi di chuyển.  
False (zero) nếu ứng dụng tự vẽ lại.  
8.  
Declare Function OffsetRect Lib "user32" Alias "OffsetRect" (lpRect As RECT, ByVal x As  
Long, ByVal y As Long) As Long  
Công dụng: Di chuyển và thay đổi kích thước một vùng hình chữ nhật. Lưu ý Các chiều kích  
thước mới không quá 72767 đơn vị.  
Tham số kèm:  
LpRect - Hình chữ nhật cần di chuyển và thay đổi kích thước.  
X
Y
9.  
- Khoảng cách dịch chuyển cho góc trái trên hình chữ nhật.  
- Khoảng cách dịch chuyển cho góc phải dưới hình chữ nhật.  
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long,  
ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long  
Công dụng: Gửi một chỉ lệnh vào hàng đợi message queue của một cửa sổ. Các chỉ lệnh này sẽ  
được xử lý theo tuần tự.  
Trị trả về: Integer - True (Khác zero) nếu thành công.  
Tham số kèm:  
HWnd Cán của cửa sổ nhận chỉ lệnh.  
WMsg Hằng số ID của chỉ lệnh. (Xin tra công dụng của các hằng ở bảng khác)  
WParam, lParam  
Các tham số tuỳ thuộc vào chỉ lệnh.  
10. Declare Function PtInRect Lib "user32" Alias "PtInRect" (lpRect As RECT, pt As POINTAPI)  
As Long  
Công dụng: K iểm tra điểm có nằm trong hình chữ nhật không.  
Trị trả về: Integer - True (Khác zero)nếu nằm trong. Zero nếu ngoài.  
Tham số kèm:  
LpRect  
pt  
Hình chữ nhật để kiểm tra.  
DDieemr cần kiểm tra.  
11. Declare Function RedrawWindow Lib "user32" Alias "RedrawWindow" (ByVal hwnd As Long,  
lprcUpdate As RECT, ByVal hrgnUpdate As Long, ByVal fuRedraw As Long) As Long  
Công dụng: Vẽ lại cửa sổ.  
Trị trả về: Integer - True (Khác zero)nếu thành công. Zero nếu thất bại.  
Tham số kèm:  
HWnd Cán của cửa sổ để vẽ lại.  
LprcUpdate  
HrgnUpdate  
FuRedraw  
- Hình chữ nhật bên trong cửa sổ cần vẽ lại.  
- Cán của miền mô tả khu vực cần vẽ lại.  
- Cờ yêu cầu vẽ lại, là một trong các hằng sau:  
RDW_ERASE - Nền phẫn vẽ lại phải xoá trước khi vẽ.  
RDW_FRAME - Cập nhật khung vẽ lại, nếu khung vẽ trùm lên tiêu đề, thực đơn,  
dòng trạng thái....  
RDW_INTERNALPAINT - Gửi chỉ lệnh WM_PAINT cho cửa sổ.  
RDW_INVALIDATE - Yêu cầu vẽ lại khu vực khung HrgnUpdate.  
RDW_NOERASE - Không xoá nền của khung cần vẽ lại.  
RDW_NOFRAME - Không cập nhật nếu khung vẽ lại trùm lên tiêu đề, thực đơn,  
dòng trạng thái.  
RDW_NOINTERNALPAINT - Cấm các chỉ lệnh WM_PAINT đối với cửa sổ.  
RDW_VALIDATE  
RDW_ERASENOW  
- Thừa nhận khung vẽ lại hợp lệ.  
- Xoá ngay khung vẽ lại.  
RDW_UPDATENOW - Cập nhật ngay khung vẽ lại.  
RDW_ALLCHIDREN  
- Thao tác vẽ lại thực hiện luôn trên cả các cửa sổ con  
(Mức Child) nằm trong khung vẽ lại.  
RDW_NOCHIDREN  
- Không vẽ lại các cửa sổ con (Mức Child), nếu nó nằm  
trong khung vẽ lại.  
12. Declare Function ScreenToClient Lib "user32" Alias "ScreenToClient" (ByVal hwnd As Long,  
lpPoint As POINTAPI) As Long  
Công dụng: Chuyển toạ độ một điểm trên màn hình thành toạ độ tương đối của cửa sổ.  
Tham số kèm:  
HWnd Cán của cửa sổ làm căn cứ toạ độ.  
LpPoint Điểm cần chuyển  
1. Declare Function IsWindow Lib "user32" Alias "IsWindow" (ByVal hwnd As Long) As Long  
Công dụng: Xác định xem có phải là cán cửa sổ không.  
Trị trả về: Integer - True (Khác zero) nếu đúng là cán cửa sổ.  
Tham số kèm:  
HWnd Cán cần kiểm tra.  
2.  
Declare Function IsWindowEnabled Lib "user32" Alias "IsWindowEnabled" (ByVal hwnd As  
Long) As Long  
Công dụng: Kiểm tra cửa sổ có hiệu lực (enabled) không.  
Trị trả về: Integer - True (Khác zero) nếu có hiệu lực.  
Tham số kèm:  
HWnd Cán của cửa sổ cần kiểm tra  
3.  
Declare Function IsWindowVisible Lib "user32" Alias "IsWindowVisible" (ByVal hwnd As  
Long) As Long  
Công dụng: Kiểm tra xem cửa sổ xem có thể nhìn thấy nó trên màn hình, kể cả cửa sổ bị cửa sổ  
khác xếp chồng lên trên.  
Trị trả về: Integer - True (Khác zero) nếu nhìn thấy được.  
Tham số kèm:  
HWnd Cán của cửa sổ cần kiểm tra.  
4.  
Declare Function IsZoomed Lib "user32" Alias "IsZoomed" (ByVal hwnd As Long) As Long  
Công dụng: Kiểm tra xem cửa sổ xem có phóng to toàn màn hình không.  
Trị trả về: Integer - True (Khác zero) nếu phóng toàn màn hình.  
Tham số kèm:  
HWnd Cán của cửa sổ cần kiểm tra.  
5.  
Declare Function LockWindowUpdate Lib "user32" Alias "LockWindowUpdate" (ByVal  
hwndLock As Long) As Long  
Công dụng: Khoá cửa sổ, không cho cập nhật. Mỗi lần chỉ có 1 cửa sổ bị khoá.  
Trị trả về: Integer - True (Khác zero) nếu thành công. Zero nếu đã có cửa sổ khác bị khoá.  
Tham số kèm:  
HWndLock Cán của cửa sổ cần khoá.  
6.  
Declare Function MapWindowPoints Lib "user32" Alias "MapWindowPoints" (ByVal  
hwndFrom As Long, ByVal hwndTo As Long, lppt As Any, ByVal cPoints As Long) As Long  
Công dụng: Chuyển đổi các điểm theo các toạ độ sử dụng (client) của một cửa sổ sang các toạ  
độ cuả cửa sổ khác.  
Tham số kèm:  
HWndFrom, HWndTo Cán của cửa sổ nguồn và đích. Nếu một cán là toạ độ theo màn hình thì  
chọn cán là cán của Desktop.  
Lppt  
Điểm chốt POINTAPI của mảng chuyển đổi.  
CPointsSố điểm chuyển đổi.  
7.  
Declare Function MoveWindow Lib "user32" Alias "MoveWindow" (ByVal hwnd As Long,  
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal  
bRepaint As Long) As Long  
Công dụng: Di chuyển và định lại kích thước cửa sổ.  
Tham số kèm:  
HWnd Cán của cửa sổ cần di chuyển.  
X,y  
Toạ độ mới của đỉnh trái cửa sổ.  
NWidth, nHeight  
BRepaint  
Chiều rộng và chiều cao mới của cửa sổ.  
Integer - True (Khác zero) nếu muốn cửa sổ vẽ lại tự động sau khi di chuyển.  
False (zero) nếu ứng dụng tự vẽ lại.  
8.  
Declare Function OffsetRect Lib "user32" Alias "OffsetRect" (lpRect As RECT, ByVal x As  
Long, ByVal y As Long) As Long  
Công dụng: Di chuyển và thay đổi kích thước một vùng hình chữ nhật. Lưu ý Các chiều kích  
thước mới không quá 72767 đơn vị.  
Tham số kèm:  
LpRect - Hình chữ nhật cần di chuyển và thay đổi kích thước.  
X
Y
9.  
- Khoảng cách dịch chuyển cho góc trái trên hình chữ nhật.  
- Khoảng cách dịch chuyển cho góc phải dưới hình chữ nhật.  
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long,  
ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long  
Công dụng: Gửi một chỉ lệnh vào hàng đợi message queue của một cửa sổ. Các chỉ lệnh này sẽ  
được xử lý theo tuần tự.  
Trị trả về: Integer - True (Khác zero) nếu thành công.  
Tham số kèm:  
HWnd Cán của cửa sổ nhận chỉ lệnh.  
WMsg Hằng số ID của chỉ lệnh. (Xin tra công dụng của các hằng ở bảng khác)  
WParam, lParam  
Các tham số tuỳ thuộc vào chỉ lệnh.  
10. Declare Function PtInRect Lib "user32" Alias "PtInRect" (lpRect As RECT, pt As POINTAPI)  
As Long  
Công dụng: K iểm tra điểm có nằm trong hình chữ nhật không.  
Trị trả về: Integer - True (Khác zero)nếu nằm trong. Zero nếu ngoài.  
Tham số kèm:  
LpRect  
pt  
Hình chữ nhật để kiểm tra.  
DDieemr cần kiểm tra.  
11. Declare Function RedrawWindow Lib "user32" Alias "RedrawWindow" (ByVal hwnd As Long,  
lprcUpdate As RECT, ByVal hrgnUpdate As Long, ByVal fuRedraw As Long) As Long  
Công dụng: Vẽ lại cửa sổ.  
Trị trả về: Integer - True (Khác zero)nếu thành công. Zero nếu thất bại.  
Tham số kèm:  
HWnd Cán của cửa sổ để vẽ lại.  
LprcUpdate  
HrgnUpdate  
FuRedraw  
- Hình chữ nhật bên trong cửa sổ cần vẽ lại.  
- Cán của miền mô tả khu vực cần vẽ lại.  
- Cờ yêu cầu vẽ lại, là một trong các hằng sau:  
RDW_ERASE - Nền phẫn vẽ lại phải xoá trước khi vẽ.  
RDW_FRAME - Cập nhật khung vẽ lại, nếu khung vẽ trùm lên tiêu đề, thực đơn,  
dòng trạng thái....  
RDW_INTERNALPAINT - Gửi chỉ lệnh WM_PAINT cho cửa sổ.  
RDW_INVALIDATE - Yêu cầu vẽ lại khu vực khung HrgnUpdate.  
RDW_NOERASE - Không xoá nền của khung cần vẽ lại.  
RDW_NOFRAME - Không cập nhật nếu khung vẽ lại trùm lên tiêu đề, thực đơn,  
dòng trạng thái.  
RDW_NOINTERNALPAINT - Cấm các chỉ lệnh WM_PAINT đối với cửa sổ.  
RDW_VALIDATE  
RDW_ERASENOW  
- Thừa nhận khung vẽ lại hợp lệ.  
- Xoá ngay khung vẽ lại.  
RDW_UPDATENOW - Cập nhật ngay khung vẽ lại.  
RDW_ALLCHIDREN  
- Thao tác vẽ lại thực hiện luôn trên cả các cửa sổ con  
(Mức Child) nằm trong khung vẽ lại.  
RDW_NOCHIDREN  
- Không vẽ lại các cửa sổ con (Mức Child), nếu nó nằm  
trong khung vẽ lại.  
12. Declare Function ScreenToClient Lib "user32" Alias "ScreenToClient" (ByVal hwnd As Long,  
lpPoint As POINTAPI) As Long  
Công dụng: Chuyển toạ độ một điểm trên màn hình thành toạ độ tương đối của cửa sổ.  
Tham số kèm:  
HWnd Cán của cửa sổ làm căn cứ toạ độ.  
LpPoint Điểm cần chuyển  
1.  
Declare Function ShowWindow Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long,  
ByVal nCmdShow As Long) As Long  
Công dụng: Điều khiển hiện cửa sổ.  
Trị trả về: Integer - Nếu cr được nhìn thấy trước đó. Zero nếu ngược lại.  
Tham số kèm:  
HWnd Cán của cửa sổ cần điều khiển.  
NCmdShow - Integer - Là các chỉ lệnh hằng sau:  
SW_HIDE: Giấu cửa sổ.  
SW_MINIMIZE: Thu nhỏ thành biểu tượng.  
SW_RESTORE: Hiện lại như lúc ban đầu, kích hoạt.  
SW_SHOW: Hiện lại như lúc chưa giấu, kích hoạt  
SW_SHOWMAXIMIZED: Hiện mở rộng tối đa, kích hoạt.  
SW_SHOWMINIMIZED: Hiện như biểu tượng, kích hoạt.  
SW_SHOWMINNOACTIVE: Thu nhỏ cửa sổ, không làm thay đổi cửa sổ đang kích hoạt.  
SW_SHOWNA: Hiện một cửa sổ ở kích thước và vị trí hiện tại, không làm thay đổi cửa  
sổ đang kích hoạt.  
SW_SHOWNOACTIVE: Hiện cửa sổ như trước khi giấu, không làm thay đổi cửa sổ  
đang kích hoạt.  
SW_SHOWNORMAL: Hiện ra bình thường.  
2.  
Declare Function SubtractRect Lib "user32" Alias "SubtractRect" (lprcDst As RECT,  
lprcSrc1 As RECT, lprcSrc2 As RECT) As Long  
Công dụng: Nạp vào cửa sổ đích phần trừ của 2 cửa sổ khác.  
Trị trả về: Integer - True (Khác zero) nếu thành công. Zero nếu thất bại.  
Tham số kèm:  
LpDestRect - Hình chữ nhật đích.  
lprcSrc1, lprcSrc2: Hai hình chữ nhật nguồn trừ nhau.  
3.  
Declare Function UnionRect Lib "user32" Alias "UnionRect" (lpDestRect As RECT,  
lpSrc1Rect As RECT, lpSrc2Rect As RECT) As Long  
Công dụng: Nạp vào cửa sổ đích phần cộng của 2 cửa sổ khác.  
Trị trả về: Integer - True (Khác zero) nếu thành công. Zero nếu thất bại.  
Tham số kèm:  
LpDestRect - Hình chữ nhật đích.  
lprcSrc1Rect, lprcSrc2Rect: Hai hình chữ nhật nguồn cần cộng.  
4.  
Declare Function UpdateWindow Lib "user32" Alias "UpdateWindow" (ByVal hwnd As Long)  
As Long  
Công dụng: Cập nhật ngay cửa sổ.  
Tham số kèm:  
HWnd Cán của cửa sổ cần cập nhật.  
5.  
Declare Function ValidateRect Lib "user32" Alias "ValidateRect" (ByVal hwnd As Long,  
lpRect As RECT) As Long  
Công dụng: Hợp lệ hoá cửa sổ, để không cần vẽ lại.  
Tham số kèm:  
HWnd Cán của cửa sổ cần hợp lệ hoá.  
LpRect - Hình chữ nhật cần hợp lệ hoá. Nếu đặt zero thì hợp lệ toàn bộ cửa sổ.  
6.  
Declare Function WindowFromPoint Lib "user32" Alias "WindowFromPoint" (ByVal xPoint  
As Long, ByVal yPoint As Long) As Long  
Công dụng: Lấy cán cửa sổ chứa (Mức Parent) điểm cần khai báo.  
Trị trả về: Integer - Cán của cửa sổ chứa (Mức Parent) điểm. Zero nếu không có cửa sổ nào.  
Tham số kèm:  
XPoint, Ypoint: Điểm theo toạ độ màn hình.  
WINDOWS API  
Khám phá từ A đến Z  
Bản chất của Windows API.  
Trong lập trình Visual Basic độc lập hoặc Visual Basic for Application, Microsoft đã cung cấp cho  
chúng ta một bộ các hàm lập sẵn, hàng trăm hàm API (Aplication Programming Interface) được  
lưu trong các tệp thư viện liên kết động (Tệp đuôi *.DLL - Dynamic Link Library). Đó là công cụ  
tuyệt vời cho phép bạn phát triển ứng dụng cực mạnh, tại sao bạn lại bỏ qua và không sử dụng  
nó?  
Tôi sẽ cùng bạn khám phá những gì mà Microsoft cung cấp các hàm Windows API trong bộ  
Visual Studio. Tuy nhiên vì khuôn khổ cũng như kích thước của bài viết, ta chỉ đi vào các nét  
chính căn bản nhất, bạn có thể tham khảo trong Help hoặc các bài viết của Nguyễn Hồ Thiên  
Đăng, Nguyễn Thị Thanh Phương tại WebsiteLH.  
I. Hàm API - Nhìn từ góc độ người ít có điều kiện học Tin học  
Nếu bạn chưa từng lập trình những chương trình lớn, bạn sẽ phát hoảng khi đọc khai báo (rắc  
rối và kỳ cục!!!) của API:  
Private Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" (ByVal hHook As  
Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long  
Tuy nhiên bạn có thể chép phần khai báo trên thật đơn giản bằng Text API Viewer. Theo các  
chuyên gia về Tin học thì đừng bao giờ sử dụng thẳng hàm API trong thủ tục thiết kế chính của  
mình. Thay vào đó ta thiết kế một hàm hay thủ tục Visual Basic thay thế hàm API để đơn giản  
hoá (Gọi là wrapper - Tôi không tìm được từ tiếng Việt tương ứng để nói đủ bản chất của nó.)  
Ví dụ một wrapper sau:  
Public Sub ThoatVaTatMay ()  
'Thoát và tắt máy  
Dim thoat  
Thoat = ExitWindowsEX(2,0)  
End Sub  
Khi đó, trong chương trình Visual Basic của ta khi cần thoát và tắt máy chỉ việc gọi:  
ThoatVaTatMay  
hoặc Call ThoatVaTatMay  
Là máy tính thực hiện thoát và tắt máy.  
Chính vì thế, khi học viên dân tộc được học phổ cập API tại Trung tâm Dạy nghề và Phổ cập Tin  
học Miền núi ABC của chúng tôi đã gọi chức năng tạo Wrapper chẳng khác dán nhãn Tiếng Việt  
cho từng loại thuốc tây API vậy. Nên khi lập trình ta nên tạo các Wrapper tương ứng với các  
chức năng mà mình muốn sử dụng. Đó cũng là lời khuyên của Bill Gate cho chúng ta.  
Để tạo các wrapper bạn hãy chèn một Module vào Project. Nếu máy của bạn không cài Visual  
Basic thì bạn phải copy hay đánh thật chính xác những dòng khai báo dạng như khai báo trên,  
thật khổ sở nếu như phần tiếng Anh của bạn không thạo lắm, vì một sai sót nhỏ có thể dẫn tới lỗi  
nặng cho máy. Nếu máy có cài Visual Basic thì quá tốt, chỉ việc khởi động API Viewer để hiện  
bảng giao tiếp như thế này:  
Bạn phải mở các tệp TXT trong thư mục API của thư mục cài Visual Basic trong máy bạn. Ví dụ  
tệp Win32api.TXT. Máy sẽ hỏi có chuyển thành dạng cơ sở dữ liệu không, thì hãy chọn có để sử  
dụng API thuận lợi và nhanh chóng hơn. Khi đã copy vào clipboard, bạn có thể dán vào module  
của mình. Nó sẽ thành dạng tương tự như thế này:  
Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" (ByVal hHook As Long,  
ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long  
Bạn phải đánh thêm vào trước khai báo trên cụm từ Private để được:  
Private Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" (ByVal hHook As  
Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long  
Tôi xin phép được nhắc lại 2 từ khoá khai báo trong Visual Basic là Private và Public.  
Private - Khai báo dùng riêng trong Module. Có nghĩa là bạn chỉ sử dụng được nó trong Module  
này. Nếu chèn Module khác sẽ không sử dụng được nó.  
Public - Khai báo dùng chung, bạn có thể dùng nó ở bất cứ Module nào.  
Bạn biết đấy, ta khai báo các hàm API thì lại dùng Private, còn khai báo các Wrapper lại dùng  
Public. Đó chính là mẹo mà chúng ta đã học trộm được của Microsoft để tránh lỗi hệ thống.  
Các hàm mà ta thiết kế trong Visual Basic có điều khác với các hàm API. Tại sao? Vì hàm ta thiết  
kế (Tạm gọi là hàm Visual Basic) thường chỉ có một kết quả trả về của hàm làm căn cứ xử lý.  
Còn hàm API không phải chỉ có một kết quả trả về mà nó còn trả về tiếp các giá trị vào các biến  
mà ta truyền cho nó. Nghĩa là có gọi nó là hàm thì bản chất nó là một thủ tục, ta gọi hàm để thực  
hiện và kiểm tra xem thủ tục trong hàm đó có thực hiện được thành công hay không mà thôi.  
Điều này chỉ hơi giống như khi bạn lập trình với hàm Visual Basic mà bạn khai báo Public Static -  
Biến tĩnh dùng chung, để làm biến đổi nó trong hàm của bạn. Ta nghiên cứu một cách tổng quát  
như sau để hiểu cặn kẽ:  
Giả sử ở một Wrapper bạn dùng công thức:  
TENBIEN=TEN_HAM_API(Bien1, Bien2, Bien3)  
Thực ra đây là một thủ tục. Nếu TENBIEN<>0 thì thủ tục này thành công.  
Khi đó các Bien1, Bien2, Bien3 truyền vào, sẽ có một giá trị mới. Lập trình API lúc này không chỉ  
xử lý TENBIEN, mà bạn có thể xử lý các Bien1, Bien2, Bien3. Đó mới thực sự là sức mạnh của  
API.  
Bản chất lập trình của biến là một vùng các ô nhớ trong RAM được đặt tên để tiện sử dụng. Tại  
một thời điểm biến chỉ có một giá trị duy nhất. Người ta có thể dùng biến này làm giá trị định vị  
hoặc kích thước lưu trữ cho biến kia. Các hàm API có thể được gọi nhiều lần để sử dụng kết quả  
trả về của các biến truyền Bien1, Bien2, Bien3 để xử lý theo quy luật xác định nào đó.  
II. Xác định mục đích khi sử dụng WinAPI.  
Trong lập trình API có thể phân làm nhiều mục đích sử dụng, tôi chưa từng được học Tin học  
một cách chính thống, nên có thể khả năng phân tích và tổng hợp những bài viết trên INTERNET  
của Microsoft khác với những bài học của những học viên học Tin học chính quy. Nhưng tôi nghĩ  
chúng ta nắm bản chất của vấn đề mới là điều quan trọng.  
Có 3 vấn đề chính khi sử dụng và khai thác WinAPI đó là:  
a. Kỹ thuật Subclass: Để cải tổ các đối tượng Visual Basic.  
b. Kỹ thuật Hook: Câu móc từ chương trình Visual Basic với các chương trình khác. Lấy giá trị  
nhập vào các chương trình khác của người sử dụng đưa vào chương trình của mình để xử lý.  
c. Kỹ thuật Multicasting: Dùng một đối tượng tạo lập để theo dõi, chi phối các đối tượng khác của  
Visual Basic.  
Bạn có thể sử dụng từng Kỹ thuật hoặc cả 3. Tuy nhiên bước đầu chưa thạo, bạn hãy thực hiện  
từng Kỹ thuật một cho thành thạo. Sau khi kiểm soát được khả năng của mình, bạn sẽ đủ trình  
độ để sử dụng WinAPI để cải tổ Windows và máy tính.  
Xin đọc tất cả các bài viết của Nguyễn Hồ Thiên Đăng, Nguyễn Thị Thanh Phương và Nguyễn  
Phương Thảo về lập trình Visual Basic trên WebsiteLH.  
Khi nắm rõ bản chất của Windows API để lập trình sâu với hệ thống, ta cũng cần hiểu biết sơ bộ  
về Hệ điều hành Windows cách thức điều khiển của Hệ điều hành đối với ứng dụng để có thể  
can thiệp như bổ sung chức năng thậm chí biến đổi nó, bắt thực hiện theo hướng của mình,  
ngay cả khi hướng này ngược hẳn với công dụng truyền thống !!!  
Các chương trình ứng dụng trong Windows có thể có nhiều cửa sổ phục vụ cho nó. Cửa sổ có  
thể là Form thậm chí là Dialog. Mỗi cửa sổ này đều có một handle (Cán) để hệ thống nhận biết  
do chính hệ điều hành Windows tạo ra. Cán cửa sổ này là chỉ số duy nhất.  
Hệ điều hành và chương trình ứng dụng đều duy trì các hàng đợi các chỉ lệnh cần thực hiện. Mỗi  
ứng dụng đều có hàng đợi (Message Queue). Khi người sử dụng ra lệnh hoặc có một biến cố,  
các chương trình điều khiển thiết bị nhập (INPUT) sẽ chuyển các thông tin vào thành chỉ lệnh và  
đặt chỉ lệnh này vào hàng đợi hệ thống (System Message Queue). Hệ điều hành lấy lần lượt các  
chỉ lệnh trong hàng đợi hệ thống kiểm tra để xác định cửa sổ nào sẽ tiếp nhận thi sẽ đặt vào  
hàng đợi của nó (thread message) một chỉ lệnh tương ứng. Các chương trình ứng dụng căn cứ  
vào chỉ lệnh này để thực hiện cũng như xử lý chúng.  
Các cửa sổ giống như một động cơ tự động chạy theo một vòng lặp. Tiếp "nhiên liệu" cho các  
"động cơ" này là hệ điều hành Windows. Hệ điều hành Windows nhận các chỉ lệnh (message) từ  
hàng đợi của hệ điều hành, dùng một hàm dạng API (Như kỳ 1 - Hàm này bản chất là một thủ  
tục) để cung cấp chỉ lệnh tới cửa sổ thông qua cán (handle) của cửa sổ.  
Có nghĩa là bản thân trong mỗi cửa sổ luôn có một hàm gọi là WinProc (Đôi khi gọi là  
WinMain()). Hàm này là cốt lõi xử lý của cửa sổ. Trong hàm, nó lặp đi lặp lại liên miên 2 dòng  
lệnh sau thông qua cấu trúc:  
Do While 0 <>GetMessage (message, 0, 0,0)  
TranslateMessage message  
DispatchMessage message  
Loop  
Trong đó message là chỉ lệnh mà Hệ điều hành cung cấp, thông qua cán (handle) của cửa sổ.  
Đương nhiên, nếu chỉ lệnh có giá trị WM_QUIT thì hàm WinProc trong cửa sổ chấm dứt vòng  
lặp.  
Còn nếu chỉ lệnh message khác giá trị trên, thì 2 dòng lệnh trên sẽ thực hiện. Cụ thể:  
TranslateMessage message -> Dịch chỉ lệnh thành dạng dữ liệu khác đặt kết quả này vào hàng  
đợi của ứng dụng.  
DispatchMessage message ->Nhận chỉ lệnh từ hàm GetMessage và gửi cho hệ thống. Hệ thống  
sẽ đưa chỉ lệnh cho ứng dụng.  
Windows có hàng ngàn chỉ lệnh khác nhau đó là các hằng dạng WM_* (Windows đặt tên cho tiện  
gọi thôi, vì bản chất các hằng này là một con số - Rất khó nhớ. Nếu phân tích chi tiết ra, những  
con số này lại là dãy số 0 và 1, tức là bật tắt ấy mà).  
Một hàm WinProc luôn nhận vào trong nó các biến theo khuôn mẫu sau để xử lý:  
Function WinProc(hwnd as Long, wc as WNDCLASSEX, message as MSG, wParam as Long,  
lparam as Long)  
Nếu hàm WinProc không xử lý các chỉ lệnh, nó phải đưa trả chỉ lệnh cho hệ điều hành xử lý  
thông qua hàm DefWindowProc. Hàm DefWindowProc gởi lại chỉ lệnh WM_CLOSE cho WinProc.  
Hàm WinProc sẽ lại gởi trả WM_CLOSE cho DefWindowProc một lần nữa như mô tả ở trên.  
Bạn có thể thấy, kết quả và cơ chế xử lý rất lằng nhằng. Ta có thể tóm lại sơ bộ như sau:  
Các chỉ lệnh đưa tới ngăn chờ trên thông thường từ các nguồn sau:  
1. Hệ thống đặt vào  
2. Chương trình khác đặt vào  
3. Chính chương trình của mình đặt vào thông qua các hàm SendMessage() và PostMessage().  
Tuy nhiên nếu bạn chọn sử dụng hàm SendMessage() thì sau khi chỉ lệnh được WinProc lấy ra  
xử lý thì chương trình mới tiếp tục chạy tiếp lệnh kế sau. Còn bạn dùng PostMessage() chỉ có tác  
dụng đặt chỉ lệnh vào hàng đợi và thực hiện ngay lệnh kế tiếp.  
Từ đây ta nhận thấy việc xử lý hệ thống của Windows thông qua cơ chế trên thì giản đơn đi rất  
nhiều. Ta sẽ có các hướng giải quyết tiếp theo như sau:  
1. Nếu ta thiết kế một hàm WinProc() mới, Ví dụ NewWinProc(), thay thế hàm WinProc() truyền  
thống  
- Rồi ta đổi địa chỉ của WinProc() gốc sang địa chỉ của WinProc() mà ta thiết kế. Trong thủ tục  
này sử dụng cấu trúc Select Case để tuỳ vào chỉ lệnh message mà xử lý theo ý mình.  
- Trường hợp chỉ lệnh message nào không thể viết được thủ tục thi hành (Không cần thay đổi  
hoặc khó quá) thì ta gọi thủ tục DefWinProc() của Windows xử lý. (Tức là dễ thì làm, khó trả lại  
ấy mà). Đây chính là Kỹ thuật Subclass.  
- Tuy nhiên nếu như hàm WinProc() cũ, xử lý tốt một số tính năng nào đó thì ta có thể tận dụng  
thủ tục bằng cách gọi lại bằng hàm CallWindowProc().  
- Thậm chí ta có thể lồng WinProc() vào trong NewWinProc() để xử lý  
(Xem các bài ví dụ của Nguyễn Phương Thảo có sử dụng API).  
2. Trường hợp không thể thay được hàm WinProc() bằng NewWinProc() (Ví dụ như bạn lập trình  
với các chương trình ứng dụng khác như Winword, Excel...) bạn phải chặn các chỉ lệnh trước khi  
nó được lấy ra khỏi hàng đợi. Đó chính là Kỹ thuật Hooking, một Kỹ thuật cực kỳ mạnh để làm  
việc với Windows.  
Trước khi chỉ lệnh được hàm SendMessage() lấy từ hàng đợi gửi đi, hoặc cũng có thể chỉ lệnh  
được lấy bằng hàm PickMessage() hay GetMessage(), ta có thể đăng ký với Windows để sử  
dụng bộ lọc HookFilter. Khi đó những chỉ lệnh cần xử lý đã đăng ký, đều qua HOOK Filter. Ta chỉ  
việc viết một thủ tục dùng hàm WinProc lấy chỉ lệnh từ HOOK Filter để xử lý. (Xem bài viết chặn  
các thủ tục in và nhập dữ liệu của Nguyễn Phương Thảo).  
3. Các đặc điểm của lớp cửa sổ:  
- Mỗi ứng dụng có thể tạo ra nhiều cửa sổ, thông thường các cửa sổ này có những đặc điểm  
giống nhau và được phân theo từng lớp CLASS. Khi lập trình, bao giờ ta cũng đăng ký lớp với hệ  
thống thông qua một hàm là RegisterClassEx(). Khi lớp đã được đăng ký (Chỉ 1 lần) thì các  
thông tin window và địa chỉ hàm WinProc sẽ được lưu trong suốt thời gian mà nó tồn tại.  
- Ta có thể thay đổi các thông tin trong bộ đăng ký lớp, khi đó nó sẽ ảnh hưởng đến toàn bộ cửa  
sổ trong lớp này.  
Bạn thân mến! Như vậy bạn đã nắm chắc về cơ chế làm việc của Windows và các thủ tục hệ  
thống của nó. Hi vọng bạn hãy đọc thật kỹ và hiểu rõ về nó, để những bài viết sau chúng ta sẽ  
mổ xẻ giải phẫu từ những hàm API cơ sở được dễ dàng hơn.  
API với Registry  
I. Sơ lược về Registry  
Registry là nơi lưu trữ tất cả các các loại cấu trúc dữ liệu. Cấu hình hệ thống Windows, cấu hình  
phần cứng máy tính, cấu hình thông tin về các chương trình ứng dụng dựa trên Win32, và các  
thiết lập người dùng khác đều được lưu trong Registry.  
Ví dụ, bất cứ một phần cứng máy tính nào thay đổi đều làm chức năng Plug and Play (Cắm và  
chạy) khởi tạo ngay và làm thay đổi luôn cấu hình trong Registry.  
Registry lưu trữ tất cả các thiết lập về cấu trúc bộ nhớ, phần cứng, thiết bị ngoại vi, và các thành  
phần liên quan đến mạng. Bạn sẽ tìm thấy ở đó nhiều hơn những thiết lập cần thiết trong các tệp  
khởi tạo ban đầu  
Từ Win98 về sau, Windows có sử dụng Registry Checker để tự quét Registry, nếu không thấy gì,  
nó tự lưu backup một lần trong ngày, nếu tìm thấy lỗi sẽ sửa... có thể sửa bằng cách thay thế  
bản Registry đã backup gần nhất còn tốt. Registry Checker tối ưu hoá và nén file backup thành  
công mỗi lần khởi động máy. Nó còn làm một loạt các việc linh tinh như loại bỏ những khoảng  
trống không dùng trong Registry, tối ưu hoá...  
Các tệp Registry của Windows.  
Registry hiện tại bao gồm 3 tệp chính:  
1. Tệp USER.DAT  
Dùng để lưu trữ những xác lập người sử dụng đối với các phần mềm.  
2. Tệp SYSTEM.DAT  
Dùng để lưu trữ những xác lập liên quan tới máy tính và phần cứng.  
3. Tệp Policy.pol  
System policies được thiết kế để chuẩn bị cho việc ghi đè bất cứ thiết lập đã được chứa trong 2  
thành phần registry khác nhau.  
System policies có thể chứa dữ liệu bổ sung đặc trưng tới mạng hay môi trường tổ hợp như đã  
được cài đặt bởi network administrator. Bản thân System policies cũng đã được chứa trong tệp  
Policy.pol. Không như SYSTEM.DAT và USER.DAT, Policy.pol không phải là thành phần bắt  
buộc của phần cài đặt Windows.  
Lời khuyên của Microsoft về những công cụ xử lý registry  
Phương pháp  
Control Panel  
System Policy Editor  
Thiết lập  
Phần lớn thiết lập hệ thống SYSTEM. Ví dụ bạn sử dụng Display Properties  
để sửa các thành phần của mục appearance  
Thiết lập người dùng, vài thiết lập hệ thống.  
Các chương trình tiện ích thứ 3 Thiết lập chi tiết ứng dụng  
Bạn có thể đã sử dụng Registry Editor để thay đổi Registry bằng tay. Tôi thường dùng Norton  
Registry Editor vì nó còn có thêm chức năng khác, ví dụ như tìm và thay thế đối với các thành  
phần của Registry.  
Từ các phần mềm Registry Editor trên, ta nhận thấy registry được bố trí thành các nhánh lớn. Tại  
mỗi nhánh có các khoá SUBKEY. Tại các SUBKEY dữ liệu được lưu ở các dạng:  
1. String (Dạng chuỗi)  
2. Numeric (Dạng số)  
3. Binary (Dạng nhị phân)  
4. Expanded String (Dạng chuỗi mở rộng)  
5. MultiString (Dạng chuỗi tổng hợp)  
(Nếu bạn dùng Registry Editor - REGEDIT. EXE thì sẽ gọi tên khác là DWORD)  
Ta hãy nghiên cứu sơ đồ mà Microsoft vẽ (Từ đĩa MSDN) về Registry:  
Nhìn sơ đồ ta nhận thấy:  
Nếu môi trường Windows là sân khấu thì Registry giống như một cuốn sổ tay của đạo diễn.  
Trong đó các thiết lập liên quan đến phần cứng thì hầu như không thay đổi (Nếu ta không thay  
phần cứng để phần đề tếch của Windows nhận ra). Nếu thay đổi phần cứng, phần đề tếch này  
sẽ bắt bạn phải đổi mã điều khiển đối với từng thiết bị.  
Xin nói thêm phần này kỹ hơn một chút vì tôi nhận được rất nhiều thư hỏi của các bạn về những  
vấn đề liên quan đến phần cứng và DRIVER. Một số đông bạn chưa hiểu rõ cách thức làm việc  
của Windows nên ngay cả những lỗi rất đơn giản như màn hình chỉ có 16 màu (Không chọn  
được 256 màu hay cao hơn như High Color, True Color) cũng không biết cách giải quyết.  
Khi máy tính của bạn có những thiết bị gì, hệ điều hành Windows khi cài đặt hoặc khi đề tếch  
thiết bị nó sẽ yêu cầu bạn phải đưa ra các tệp DRIVER của thiết bị đó. DRIVER là gì ư? Ồ! Nó  
chỉ là tệp mã điều khiển thiết bị. Giống như sơ đồ công tắc của thiết bị nào đó. Khi máy tính có  
công việc liên quan đến điều khiển thiết bị, hệ điều hành Windows sẽ tra trong Registry xem tệp  
mã nó là tệp nào. Tệp mã sẽ được nạp vào RAM một phần hay toàn bộ, ở một vị trí nào đó. Căn  
cứ vào lệnh đưa tới từ chương trình, Hệ điều hành sẽ đưa lệnh tới địa chỉ phần mã điều khiển  
này. Phần mã điều khiển sẽ chỉ tiếp cho con trỏ tới vị trí của lệnh cần thực hiện năm trong phần  
mã, tương ứng với mã lệnh đưa tới. Khi đó công việc được thực hiện chính xác vì phần mã đúng  
với thiết bị.  
Nếu thiết bị một kiểu, mã DRIVER khác với kiểu được lắp vào máy, thì chẳng khác gì bạn đưa ra  
một sơ đồ máy khác với máy đang sử dụng. Khi đó sẽ có xung đột, trường hợp này Windows sẽ  
tự chuyển sang chức năng Đờ phôn ngầm định đối với các khoá, và như vậy bạn sẽ thấy  
Windows không thể hiện đúng với thực tế của mình. Bạn có thể vào Control Panel chọn mục  
System để kiểm tra, nếu thấy dấu ? cạnh tên mã thiết bị phần nào thì chọn Update để đổi mã.  
Các khoá về mã phần cứng đều được lưu trong tệp SYSTEM.DAT. Do phần này ít thay đổi, vả  
lại chức năng Plug and Play của Windows quá siêu, nên ta sẽ tạm gác nghiên cứu đến phần này.  
Sau này tôi sẽ đề nghị một chương trình khoá thiết bị bằng phần mềm ở những chương sau.  
Tải về để xem bản đầy đủ
doc 86 trang baolam 20540 Free
Bạn đang xem 20 trang mẫu của tài liệu "Các hàm API liên quan đến cửa sổ", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • doccac_ham_api_lien_quan_den_cua_so.doc