Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 1 
LỜI NÓI ĐẦU 
 Khi đọc những lời nói này, tôi nghĩ rằng dù bạn là một người lập trình viên giỏi hay là một 
người mới chập chững bước vào thế giới của những đoạn code thì chắc hẳn tất cả các bạn đều 
là những người yêu thích công nghệ thông tin nói chung và lập trình nói riêng. Và bản thân tôi 
cũng vậy, là một người yêu thích công nghệ thông tin đứng ở khía cạnh này tôi tự nhận thấy để 
nghiên cứu, học tập, làm việc được tốt thì phải có nhiều tư liệu, sách báo phù hợp với mình. 
Chính bởi vì lẽ đó, tôi đã soạn cuốn sách này với hy vọng đây là một cuốn sách tra cứu hữu ích 
bổ sung thêm vào kho tư liệu của mình. 
 Cuốn sách này được biên soạn từ rất nhiều nguồn tư liệu, và chủ yếu tôi chỉ dùng cho 
riêng bản thân mình do đó khó tránh khỏi những sai xót, vì thế tôi rất mong nhận được nhiều ý 
kiến đóng góp của các bạn để những phiên bản sau ngày càng hoàn thiện hơn. 
Đồng thời tôi cũng xin tặng cuốn sách này cho tất cả các bạn yêu thích công nghệ thông 
tin với hy vọng nó sẽ giúp ích một phần nào đó trong công việc của các bạn, nhưng tôi mong các 
bạn hãy tôn trọng tác giả bằng cách không chỉnh sửa nội dung, xuất xứ của cuốn sách. Cuốn 
sách này hoàn toàn miễn phí, do đó các bạn có thể cho, tặng, biếu bất kỳ người nào nhưng tuyệt 
đối cấm thương mại (mua, bán) dưới bất kỳ hình thức nào. 
Mọi chi tiết thắc mắc, góp ý xin vui lòng liên hệ : 
[email protected] 
Xin cám ơn ! 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 2 
Phần I 
SƠ LƯỢC VỀ WINDOWS API 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 3 
1. API là gì : 
API là viết tắt của Application Programming Interface (giao diện lập trình ứng dụng). 
API cung cấp hầu hết các tính năng thông dụng cho tất cả các chương trình chạy trên 
nền Window. Hầu hết các hàm API thường được chứa trong file DLL trong thư mục hệ thống 
Window (thường là C:/Windows/System). 
2. Các thành phần của Windows API : 
Có 4 thành phần tạo nên Windows API : 
• Các hàm (function) : là thành phần chính của Windows API, chúng được chứa 
trong các file DLL và có thể được truy xuất một các dễ dàng bởi các chương trình 
trên nền Window. 
• Các cấu trúc (structure) : nhiều hàm API đòi hỏi một cấu trúc phải được truyền cho 
chúng để có thể vận chuyển một lượng lớn thông tin mà không cần phải dùng quá 
nhiều đối số. Các cấu trúc này được dùng trong các hàm API nhưng các bạn phải 
tự định nghĩa. 
• Các hằng được đặt tên (named constant) : cũng như cấu trúc, các hằng phải 
được định nghĩa rõ ràng trong chương trình. 
• Các hàm callback (callback function) : về mặt khái niệm, các hàm callback ngược 
với các hàm API. Một hàm callback được định nghĩa hoàn toàn trong chương trình 
của bạn. Sau đó hàm này sẽ được một hàm API khác gọi khi nó thực thi một tác 
vụ nào đó. Các hàm callback cung cấp một cách thức để chương trình của bạn có 
thể can thiệp trực tiếp vào một tác vụ nào đó. 
3. Cách dùng các hàm API : 
a. Cách khai báo : 
Các hàm API có 2 dạng: hàm (Function) có trị trả về và thủ tục (Sub) không có trị trả về. 
Khai báo cho hàm có trị trả về như sau: 
Declare Function Lib [Alias ] ([danh sách 
các đối số]) as 
Khai báo cho các thủ tục: 
Declare Sub Lib [Alias ] ([danh sách các 
đối số]) 
Trong đó : 
• là tên hàm trong các file thư viện DLL. 
• tên file thư viện DLL để Visual Basic tìm các hàm API. Các file thư viện 
này phải có đầy đủ tên cùng phần mở rộng, riêng đối với 3 thư viện USER, KERNEL, và 
GUI thì không cần phải có phần mở rộng. Tên này là một String nên cần phải báo trong 
dấu "". 
• [Alias ] có thể có hay không cũng được. Bạn cần khai báo bí danh khi muốn 
triệu gọi hàm API với một cái tên khác do chính bạn đặt, hoặc trong tên hàm chuẩn có 
chứa ký tự bị cấm sử dụng trong Visual Basic, lúc này bạn hãy đặt bí danh cho nó để 
Visual Basic sử dụng được. 
Ví dụ : 
Hàm API "AddfontResource " sau đây được đặt lại bí danh là AddFont cho ngắn gọn mỗi 
lần gọi hàm. 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 4 
Declare Function AddFontResource Lib "gdi32" Alias "AddFont" (ByVal lpFileName As 
String) As Long 
Phạm vi sử dụng của hàm API cũng phụ thuộc vào các vị trí khai báo nó như cách khai 
báo các biến trong Visual Basic. 
Phần sau mệnh đề Lib sẽ báo cho VisualBasic biết file .dll có chứa thủ tục đã khai báo. 
Đối với các thư viện User32, Kernel32, GDI32 bạn không cần phải ghi thêm phần tên mở rộng 
của tập tin: 
Ví dụ : 
Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long 
Trong khi đối với những file .dll khác, bạn phải khai báo đường dẫn đầy đủ : 
Ví dụ: 
Declare Function lzCopy Lib "c:\windows\lzexpand.dll" (ByVal S As Integer, ByVal D As 
Integer) As Long 
Nếu không khai báo đường dẫn đầy đủ, VisualBasic sẽ tìm lần lượt trong: 
1. Thư mục chứa file thực thi .exe 
2. Thư mục hiện hành 
3. \Windows\System32 
4. \Windows\System 
5. \Windows 
6. Đường dẫn đã được khai báo trước 
b. Các file thư viện phổ biến : 
Advapi32.dll : Advanced API services library supporting numerous APIs including many 
security and Registry calls 
Comdlg32.dll : Thư viện API dùng cho các hộp thoại (Common dialog API library) 
Gdi32.dll : Thư viện API dùng cho giao diện ứng dụng đồ hoạ 
Kernel32.dll : Core Windows 32-bit base API support 
Lz32.dll : 32-bit compression routines 
Mpr.dll : Multiple Provider Router library 
Netapi32.dll : 32-bit Network API library 
Shell32.dll : 32-bit Shell API library 
User32.dll : Library for user interface routines 
Version.dll : Thư viện các phiên bản (Version library) 
Winmm.dll : Windows multimedia library 
Bốn thư viện chính của Windows : 
KERNEL32 : The main DLL, Kernel32, handles memory management, multitasking of the 
programs that are running, and most other functions which directly affect how Windows actually 
runs. 
USER32 : Windows management library. Contains functions which deal with menus, 
timers, communications, files and many other non-display areas of Windows. 
GDI32 : Graphics Device Interface. Provides the functions necessary to draw things on 
the screen, as well as checking which areas of forms need to be redrawn. 
WINMM : Provides multimedia functions for dealing with sound, music, real-time video, 
sampling and more. This is a 32-bit only DLL. The 16 bit equivalent is called MMSYSTEM. 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 5 
4. Handle là gì : 
Handle : (cán) tạm gọi là địa chỉ 
Là một biến kiểu Long có giá trị nhận biết duy nhất dùng để định nghĩa một đối tượng. 
Và trong Windows thì mỗi đối tượng (control) sẽ được gắn cho 1 địa chỉ riêng, giống như số 
CMND của mình vậy đó, và khi chúng ta muốn làm việc với đối tượng nào thì phải trỏ tới địa chỉ 
của đối tượng đó, cái địa chỉ đó được gọi là handle của mỗi đối tượng. Mỗi cửa sổ trong HĐH 
Windows thì được định nghĩa bởi một handle. Bạn có thể lấy được tất cả các thông tin về một đối 
tượng sau khi bạn lấy được handle của nó. 
5. Có 3 vấn đề chính khi sử dụng và khai thác WinAPI 
• Kỹ thuật Subclass: Để cải tổ các đối tượng Visual Basic. 
• 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ý. 
• 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. 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 6 
Phần II 
CÁC HÀM API 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 7 
CHƯƠNG I - Các hàm liên quan đến cửa sổ : 
(trích dẫn từ trung tâm tin học ABC) 
1. AdjustWindowRect 
- Thư viện : user32.dll 
- Hệ điều hành : Windows NT 3.1 or later; Windows 95 or later 
- Khai báo : 
Declare Function AdjustWindowRect Lib "user32" Alias "AdjustWindowRect" (lpRect As 
RECT, ByVal dwStyle As Long, ByVal bMenu As Long) As Long 
- Các tham số : 
• lpRect : con trỏ tới một cấu trúc RECT chứa vùng làm việc client. 
• dwStyle : kiểu cửa sổ 
• bMenu : trả về TRUE (khác 0) nếu cửa sổ có menu. 
- Mô tả : hàm AdjustWindowRect điều chỉnh kích thước của 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). 
Ngoài ra kích thước của cửa sổ có thể sử dụng hàm CreateWindow để tạo một cửa 
sổ có diện tích vùng client tuỳ ý. 
- Các hàm liên quan : AdjustWindowRectEx 
- Ví dụ minh hoạ : DeferWindowPos 
Const WS_BORDER = &H800000 
Const WS_DLGFRAME = &H400000 
Const WS_THICKFRAME = &H40000 
Const WS_CAPTION = &HC00000 ' WS_BORDER Or WS_DLGFRAME 
Const HWND_BOTTOM = 1 
Const HWND_TOP = 0 
Const HWND_TOPMOST = -1 
Const HWND_NOTOPMOST = -2 
Const SWP_SHOWWINDOW = &H40 
Private Type RECT 
 Left As Long 
 Top As Long 
 Right As Long 
 Bottom As Long 
End Type 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 8 
Private Declare Function AdjustWindowRect Lib "user32" (lpRect As RECT, ByVal dwStyle As 
Long, ByVal bMenu As Long) As Long 
Private Declare Function BeginDeferWindowPos Lib "user32" (ByVal nNumWindows As Long) As 
Long 
Private Declare Function DeferWindowPos Lib "user32" (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 
Private Declare Function EndDeferWindowPos Lib "user32" (ByVal hWinPosInfo As Long) As Long 
Private Sub Form_Load() 
 'KPD-Team 2000 
 'URL:  
 'E-Mail: 
[email protected] 
 Dim R As RECT, hDWP As Long 
 R.Left = 30 
 R.Top = 30 
 R.Bottom = 200 
 R.Right = 120 
 AdjustWindowRect R, WS_THICKFRAME Or WS_CAPTION, False 
 hDWP = BeginDeferWindowPos(1) 
 DeferWindowPos hDWP, Me.hwnd, HWND_TOP, R.Left, R.Top, R.Right - R.Left, R.Bottom - 
R.Top, SWP_SHOWWINDOW 
 EndDeferWindowPos hDWP 
End Sub 
2. AdjustWindowRectEx 
- Thư viện : user32.dll 
- Hệ điều hành : Windows NT 3.1 or later; Windows 95 or later 
- Khai báo : 
Declare Function AdjustWindowRectEx Lib "user32" Alias "AdjustWindowRectEx" (lpRect 
As RECT, ByVal dsStyle As Long, ByVal bMenu As Long, ByVal dwEsStyle As Long) As 
Long 
- Các tham số : 
• lpRect : con trỏ tới một cấu trúc RECT chứa vùng làm việc client. 
• dwStyle : kiểu cửa sổ 
• bMenu : trả về TRUE (khác 0) nếu cửa sổ có menu. 
• dwExStyle : kiểu mở rộng của cửa sổ 
- Mô tả : hàm AdjustWindowRectEx điều chỉnh kích thước của 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). Ngoài ra kích thước của cửa sổ có thể sử dụng hàm CreateWindowEx để tạo 
một cửa sổ có diện tích vùng client tuỳ ý. 
- Các hàm liên quan : AdjustWindowRect 
- Ví dụ minh hoạ : AdjustWindowRectEx 
Const WS_BORDER = &H800000 
Const WS_DLGFRAME = &H400000 
Const WS_THICKFRAME = &H40000 
Const WS_CAPTION = &HC00000 ' WS_BORDER Or WS_DLGFRAME 
Const WS_EX_CLIENTEDGE = &H200 
Private Type RECT 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 9 
 Left As Long 
 Top As Long 
 Right As Long 
 Bottom As Long 
End Type 
Private Declare Function AdjustWindowRectEx Lib "user32" (lpRect As RECT, ByVal dsStyle As 
Long, ByVal bMenu As Long, ByVal dwEsStyle As Long) As Long 
Private Declare Function MoveWindow Lib "user32" (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 
Private Sub Form_Load() 
 'KPD-Team 2000 
 'URL:  
 'E-Mail: 
[email protected] 
 Dim R As RECT, hDWP As Long 
 R.Left = 30 
 R.Top = 30 
 R.Bottom = 200 
 R.Right = 120 
 AdjustWindowRectEx R, WS_THICKFRAME Or WS_CAPTION, False, WS_EX_CLIENTEDGE 
 MoveWindow Me.hwnd, R.Left, R.Top, R.Right - R.Left, R.Bottom - R.Top, False 
End Sub 
3. AnyPopup 
- Thư viện : user32.dll 
- Hệ điều hành : Windows NT 3.1 or later; Windows 95 or later 
- Khai báo : 
Public Declare Function AnyPopup Lib "user32" Alias "AnyPopup" () As Long 
- Mô tả : Đưa ra chỉ số cửa sổ popup hiện đang tồn tại trên màn hình. 
- Trị trả về: Hàm trả về TRUE (khác 0) nếu có cửa sổ popup. 
4. ArrangeIconicWindows 
- Thư viện : user32.dll 
- Hệ điều hành : Windows NT 3.1 or later; Windows 95 or later 
- Khai báo 
Public Declare Function ArrangeIconicWindows Lib "user32" Alias 
"ArrangeIconicWindows" (ByVal hwnd As Long) As Long 
- Các tham số : 
• hwnd : handle của cửa sổ chứa (m ức parent) 
- Mô tả : 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ề : Hàm trả về số long chiều cao của hàng biểu tượng (bằng 0 nếu thất bại) 
5. BeginDeferWindowPos 
- Thư viện : user32.dll 
- Hệ điều hành : Windows NT 3.1 or later; Windows 95 or later 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 10 
- Khai báo : 
Declare Function BeginDeferWindowPos Lib "user32" Alias "BeginDeferWindowPos" 
(ByVal nNumWindows As Long) As Long 
- Các tham số : 
• nNumWindows : Số cửa sổ ban đầu để cấp phát vùng nhớ trống. 
- Mô tả : 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ề : số long – handle của cấu trúc bản đồ. 0 nếu thất bại 
- Các hàm liên quan : 
• DeferWindowPos 
• EndDeferWindowPos 
- Các ví dụ minh hoạ : xem ví dụ DeferWindowPos của hàm AdjustWindowRect trang 7. 
6. BringWindowToTop 
- Thư viện : user32.dll 
- Hệ điều hành : Windows NT 3.1 or later; Windows 95 or later 
- Khai báo : 
Declare Function BringWindowToTop Lib "user32" Alias "BringWindowToTop" (ByVal 
hwnd As Long) As Long 
- Các tham số : 
• hwnd : handle của cửa sổ muốn đưa lên trên cùng ( cửa sổ topmost ) trong danh 
sách Z-order 
- Mô tả : đưa một cửa sổ chỉ định lên trên cùng trong danh sách thứ tự Z-order (thứ tự 
hiển thị các cửa sổ), làm cho nó nằm trên tất cả các cửa sổ khác (topmost). Hàm này 
có tác dụng tương tự như hàm SetWindowPos để đặt cửa sổ lên trên cùng trong Z-
order. 
- Các hàm liên quan : SetWindowPos 
- Các ví dụ minh hoạ : Window to top 
'This program needs two forms, two buttons and a module 
'KPD-Team 1998 
'URL:  
'E-Mail: 
[email protected] 
Private Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long 
Private Sub Command1_Click() 
 'in form1 
 'Set Form2 on top 
 BringWindowToTop Form2.hwnd 
End Sub 
Private Sub Form_Load() 
 'in form1 
 Form2.Visible = True 
End Sub 
Private Sub Command1_Click() 
 'in form2 
 'Set Form1 on top 
 BringWindowToTop Form1.hwnd 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 11 
End Sub 
7. BrowseCallbackProc 
- Khai báo : 
Public Function BrowseCallbackProc (ByVal hwnd As Long, ByVal uMsg As Long, ByVal 
lParam As Long, ByVal lpData As Long) As Long 
 ‘ Đoạn mã xác định ứng dụng đặt tại đây 
End Function 
- Các tham số : 
• hwnd : handle của cửa duyệt thư mục của hộp thoại Folder đang gọi hàm này. 
Handle này dùng để giử các thông điệp cho hộp thoại. 
• uMsg : một trong các cờ dưới đây xác định các sự kiện 
 BFFM_INITIALIZED : hộp thoại hoàn tất khởi tạo, lParam = 0 
 BFFM_SELCHANGED : người dùng đã thay đổi lựa chọn hiện thời, lParam là 
một PIDL đến lựa chọn hiện thời. 
 BFFM_VALIDATEFAILED : từ Intenet Explorer 4.0 trở đi : thông báo rằng 
người dùng nhập một đường dẫn sai vào hộp soạn thảo. lParam là một con 
trỏ trỏ tới một chuỗi (kết thúc bằng ký tự NULL) chứa tên đường dẫn sai này. 
• lParam : phụ thuộc vào giá trị uMsg . 
• lpData : giá trị do ứng dụng định nghĩa được trong cấu trúc BROWSEINFO dùng 
để tạo hộp thoại. 
- Mô tả : hàm callback BrowseCallbackProc xử lý các thông điệp của cửa sổ duyệt của 
các hộp thoại Folder. Cụ thể, hàm này sẽ đưa ra những thông điệp thông báo khi hộp 
thoại đang được khởi chạy và khi người dùng thay đổi các lựa chọn hiện thời. Hàm 
callback có thể làm việc với hộp thoại đang được khởi chạy và khi người dùng thay 
đổi các lựa chọn hiện thời. Hàm callback có thể làm việc với hộp thoại bằng cách giử 
cho nó một trong những thông điệp sau bằng hàm SendMessage 
• BFFM_ENABLEOK : Enable hoặc Disable nút OK của hộp thoại. Để Enable nút 
OK, thiết lập tham số thông điệp lParam là một giá trị khác 0. Để Disable nút OK, 
thiết lập tham số lParam bằng 0. 
• BFFM_SETSELECTION : thiết lập lựa chọn hiện thời trong hộp thoại. Để định rõ 
đường dẫn như mong muốn bằng cách dùng một chuỗi, thiết lập tham số thông 
điệp lParam là chuỗi và tham số thông điệp wParam là một số khác 0. Để định rõ 
đường dẫn theo mong muốn bằng cách sử dụng một con trỏ tới một cấu trúc 
ITEMIDLIST, thiết lập tham số thông điệp lParam là PIDL và tham số thông điệp 
wParam là 0. 
• BFFM_SETSTATUSTEXT : thiết lập trạng thái của văn bản được hiển thị bởi hộp 
thoại nếu có. Thiết lập tham số thông điệp lParam là chuỗi chứa văn bản mong 
muốn. 
- Giá trị trả về : 
• Hàm luôn luôn trả về 0 nếu hộp dialog không xử lý thông điệp 
BFFM_VALIDATEFAILED. 
• Hàm trả về 0 để đóng hộp thoại, hoặc trả về giá trị khác 0 để giữ cho nó vẫn được 
hiển thị. 
- Hằng định nghĩa : 
• Const BFFM_ENABLEOK = &H465 
• Const BFFM_SETSELECTION = &H466 
• Const BFFM_SETSTATUSTEXT = &H464 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 12 
• Const BFFM_INITIALIZED = 1 
• Const BFFM_SELCHANGED = 2 
• Const BFFM_VALIDATEFAILED = 3 
- Ghi chú : giống như tất cả các hàm callback khác, hàm BrowseCallbackProc phải 
được khai báo public trong một module. 
- Sử dụng bởi : BROWSEINFO 
8. CallWindowProc 
- Thư viện : user32.dll 
- Hệ điều hành : Windows NT 3.1 or later; Windows 95 or later 
- Khai báo : 
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal 
lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As 
Long, ByVal lParam As Long) As Long 
- Các tham số : 
• lpPrevWndFunc : Con trỏ tới hàm thủ tục Window để gọi một cách tường minh. 
Hàm này dùng để xử lý thông tin. Nếu giá trị này được gọi bởi hàm 
GetWindowLong với tham số nIndex được thiết lập là GWL_WNDPROC hoặc 
DWL_DLGPROC, thậm trí nó còn là địa chỉ của cửa sổ hoặc thủ tục của hộp thoại 
hoặc là handle đại diện cho địa chỉ đó. 
• hWnd : một handle cho cửa sổ xử lý thông điệp. 
• Msg : thông điệp để xử lý 
• wParam : thông tin bổ xung về thông điệp, nội dung của tham số này phụ thuộc 
vào tham số Msg. 
• lParam : thông tin bổ sung về thông điệp, nội dung tham số này phụ thuộc vào 
tham số Msg. 
- Mô tả : (gọi tường minh là hàm hook) hoạt động như là một thủ tục của cửa sổ để xử 
lý một thông điệp. Nó cho phép một thông điệp của cửa sổ được xử lý bằng một thủ 
tục cửa sổ mà không nhất thiết là thủ tục thường được gọi bởi cửa sổ. 
- Trị trả về : hàm trả về giá trị được tạo ra sau khi xử lý thông điệp được giử 
- Các hàm liên quan : 
• DefMDIChildProc 
• DefWindowProc 
- Các ví dụ minh hoạ : 
+ Ví dụ 1 : Clipboard Viewer 
'Create a new project, add a module to it 
'Add a command button to Form1 
'In the form 
Private Sub Form_Load() 
 'KPD-Team 1999 
 'URL:  
 'E-Mail: 
[email protected] 
 'Subclass this form 
 HookForm Me 
 'Register this form as a Clipboardviewer 
 SetClipboardViewer Me.hwnd 
End Sub 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 13 
Private Sub Form_Unload(Cancel As Integer) 
 'Unhook the form 
 UnHookForm Me 
End Sub 
Private Sub Command1_Click() 
 'Change the clipboard 
 Clipboard.Clear 
 Clipboard.SetText "Hello !" 
End Sub 
'In a module 
'These routines are explained in our subclassing tutorial. 
' 
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, 
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc 
As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As 
Long) As Long 
Declare Function SetClipboardViewer Lib "user32" (ByVal hwnd As Long) As Long 
Public Const WM_DRAWCLIPBOARD = &H308 
Public Const GWL_WNDPROC = (-4) 
Dim PrevProc As Long 
Public Sub HookForm(F As Form) 
 PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc) 
End Sub 
Public Sub UnHookForm(F As Form) 
 SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc 
End Sub 
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, 
ByVal lParam As Long) As Long 
 WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam) 
 If uMsg = WM_DRAWCLIPBOARD Then 
 MsgBox "Clipboard changed ..." 
 End If 
End Function 
+ Ví dụ 2 : Call Procedure 
‘Create a new project and add this code to Form1 
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long 
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As 
String) As Long 
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal 
lpProcName As String) As Long 
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal 
lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal 
lParam As Any) As Long 
Private Sub Form_Load() 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 14 
 On Error Resume Next 
 'KPD-Team 1999 
 'URL:  
 'E-Mail: 
[email protected] 
 'We're going to call an API-function, without declaring it! 
 Dim lb As Long, pa As Long 
 'map 'user32' into the address space of the calling process. 
 lb = LoadLibrary("user32") 
 'retrieve the address of 'SetWindowTextA' 
 pa = GetProcAddress(lb, "SetWindowTextA") 
 'Call the SetWindowTextA-function 
 CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0& 
 'unmap the library's address 
 FreeLibrary lb 
End Sub 
+ Ví dụ 3 : Low Level Audio Stream 
'This Project needs a module and a form. The Form must contain two buttons, a horizontal scrollbar 
and a timer 
'Add this code to the form: 
Dim fMovingSlider As Boolean 
Private Sub Command1_Click() 
 Timer1.Interval = 100 
 Timer1.Enabled = True 
 FileSeek 0 
 Play 
End Sub 
Private Sub Command2_Click() 
 Timer1.Enabled = False 
 StopPlay 
End Sub 
Private Sub Form_Load() 
 'KPD-Team 1999 
 'URL:  
 'E-Mail: 
[email protected] 
 Const sWavFile = "c:\windows\msremind.wav" 
 'Check if the file exists 
 If Dir(sWavFile) = "" Or sWavFile = "" Then 
 HScroll1.Enabled = False 
 MsgBox "File not found !" + vbCrLf + "Please choose a valid file !", vbCritical + vbOKOnly 
 Exit Sub 
 End If 
 HScroll1.Max = 100 
 HScroll1.SmallChange = 1 
 HScroll1.LargeChange = 5 
 Command1.Caption = "Play" 
 Command2.Caption = "Stop" 
 MsgBox "This method uses subclassing, so never press the Stop-button." + vbCrLf + "Unload this 
form properly by pressing the 'X'", vbInformation + vbOKOnly 
 'Initialize 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 15 
 Initialize Me.hwnd 
 'Open the file 
 OpenFile sWavFile 
End Sub 
Private Sub Form_Unload(Cancel As Integer) 
 'If we're playing then stop 
 If Playing() Then StopPlay 
 'Close the file 
 CloseFile 
End Sub 
Private Sub HScroll1_Change() 
 If fMovingSlider = True Then 
 fMovingSlider = False 
 'move to a new position 
 FileSeek (HScroll1.Value / 100) * Length 
 End If 
End Sub 
Private Sub HScroll1_Scroll() 
 fMovingSlider = True 
End Sub 
Private Sub Timer1_Timer() 
On Error Resume Next 
 If (fMovingSlider) Then Exit Sub 
 If (Playing() = False) Then 
 Timer1.Enabled = False 
 End If 
 HScroll1.Value = (Position() / Length()) * 100 
End Sub 
'Add this code to a module: 
Public Const CALLBACK_WINDOW = &H10000 
Public Const MMIO_READ = &H0 
Public Const MMIO_FINDCHUNK = &H10 
Public Const MMIO_FINDRIFF = &H20 
Public Const MM_WOM_DONE = &H3BD 
Public Const MMSYSERR_NOERROR = 0 
Public Const SEEK_CUR = 1 
Public Const SEEK_END = 2 
Public Const SEEK_SET = 0 
Public Const TIME_BYTES = &H4 
Public Const WHDR_DONE = &H1 
Type mmioinfo 
 dwFlags As Long 
 fccIOProc As Long 
 pIOProc As Long 
 wErrorRet As Long 
 htask As Long 
 cchBuffer As Long 
 pchBuffer As String 
 pchNext As String 
 pchEndRead As String 
 pchEndWrite As String 
Nghiên cứu Windows API 
Nguyễn Nam Trung Trang 16 
 lBufOffset As Long 
 lDiskOffset As Long 
 adwInfo(4) As Long 
 dwReserved1 As Long 
 dwReserved2 As Long 
 hmmio As Long 
End Type 
Type WAVEHDR 
 lpData As Long 
 dwBufferLength As Long 
 dwBytesRecorded As Long 
 dwUser As Long 
 dwFlags As Long 
 dwLoops As Long 
 lpNext As Long 
 Reserved As Long 
End Type 
Type WAVEINCAPS 
 wMid As Integer 
 wPid As Integer 
 vDriverVersion As Long 
 szPname As String * 32 
 dwFormats As Long 
 wChannels As Integer 
End Type 
Type WAVEFORMAT 
 wFormatTag As Integer 
 nChannels As Integer 
 nSamplesPerSec As Long 
 nAvgBytesPerSec As Long 
 nBlockAlign As Integer 
 wBitsPerSample As Integer 
 cbSize As Integer 
End Type 
Type MMCKINFO 
 ckid As Long 
 ckSize As Long 
 fccType As Long 
 dwDataOffset As Long 
 dwFlags As Long 
End Type 
Type MMTIME 
 wType As Long 
 u As Long 
 x As Long 
End Type 
Declare Function waveOutGetPosition Lib "winmm.dll" (