Trở về
Tham gia nhóm m Autoit đ đưc hưng dn và gii đáp trc tiếp : http://fb.com/groups/autoitscript
Tin tức công nghệ  -  Thủ thuật lập trình

Sunday, September 29, 2013

Tìm hiểu Windows API và thư viện WinAPI của Autoit


Toàn màn hìnhIn bài viết

 Windows API



API là viết tắt của Application Programming Interface (giao diện lập trình ứng dụng). Nó là 1 giao tiếp phần mềm được dùng bởi các ứng dụng khác nhau. Cũng giống như bàn phím là một thiết bị giao tiếp giữa ngườI dùng và máy tính, API là 1 giao tiếp phần mếm chẳng hạn như giữa chương trình và hệ điều hành (HĐH). Bộ API của từng HĐH là khác nhau, làm cho các HĐH khác nhau và thường không tương thích với nhau. Ví dụ những phần mềm trên máy Macintosh không thể chạy được trên máy Windows bởi vì Macintosh và Windows có các API hòan tòan khác nhau.

Windows API quản lý mọi vấn đề làm ra Windows. Tuy nhiên nó đồng thời cũng cung cấp hầu hết các tính năng thông dụng (Open, Save As, Choose Font,…), các thiết lập HĐH, các sự kiện,… Các ứng dụng trên nền Windows dùng Windows API hầu như trong mỗi tác vụ. Thậm chí nếu bạn không dùng API trong khi lập trình thì ngôn ngữ lập trình cũng sẽ gọi các API trong chương trình được tạo ra để quản lý nhiều tác vụ khác nhau.

Hầu hết các hàm API được chứa trong các file DLL (Dynamic Link Library – thư viện liên kết động) chứa trong thư mục hệ thống của Windows. Các file DLL cho phép các chương trình bên ngòai dùng các hàm của chúng.

Khai báo hàm:
Trước khi 1 hàm API có thể được dùng trong Visual Basic, nó phải được khai báo. Bằng việc khai báo hàm, bạn báo cho Visual Basic biết phải tìm hàm đó ở đâu. Phần khai báo đặc tả tên của hàm, file .dll chứa nó, các tham số hàm và kiểu dữ liệu trả về (nếu có).
Phát biểu Declare trong Visual Basic dùng để khai báo 1 hàm. Phát biểu Declare chỉ có thể xuất hiện trong phần khai báo của 1 Form hay 1 Module. Nếu nó xuất hiện trong form, phần khai báo phải là Private, điều này làm cho hàm chỉ truy xuất được trong form. Nếu nó xuất hiện trong 1 module, phần khai báo có thể là Public hoặc Private. Từ khóa Public làm cho hàm có thể được dùng trong tòan bộ chương trình, còn từ khóa Private giới hạn nó chỉ được dùng trong moodule mà thôi.

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 function_name Lib “DLL_filename” [Alias “function_alias” (argument_list) As data_type

Khai báo cho các thủ tục:
Declare Sub function_name Lib “DLL_filename” [Alias “function_alias” (argument_list)

function_name: Là tên của hàm API. Đây là tên mà Visual Basic tham chiếu đến hàm mỗi khi nó được gọi.

DLL_filename: Tên của file .dl chứa hàm. 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 "".

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. WindowsSystem32
4. WindowsSystem
5. Windows
6. Đường dẫn đã được khai báo trước

Sau đây là 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 : Common dialog API library
Gdi32.dll : Graphics Device Interface API library (các hàm giao tiếp thiết bị đồ họa)
Kernel32.dll : Core Windows 32-bit base API support (các hàm của HĐH)
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 (các hàm hệ vỏ Windows)
User32.dll : Library for user interface routines (các hàm giao diện người dùng)
Version.dll : 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.


function_alias (tùy chọn, có hay không cũng được): Là tên thật sự của hàm lưu trong file .dll. Điều này là quan trọng bởi vì hầu hết các hàm nhận tham số kiểu String đều có 2 phiên bản: 1 phiên bản ANSI chuẩn dùng để xử lý các ký tự không phải Unicode và 1 phiên bản để xử lý ký tự Unicode. Nếu cả 2 phiên bản cùng được chứa trong 1 file .dll thì phiên bản không Unicode sẽ thêm hậu tố A và phiên bản Unicode sẽ thêm hậu tố W. Ví dụ: hàm CompareString có 2 phiên bản làCompareStringA và CompareStringW.

argument_list: Danh sách các đối số mà hàm yêu cầu. Xác định có bao nhiêu đối số và kiểu tương ứng của mỗi đối số được truyền cho hàm. Cú pháp như sau:

[{ByVal | ByRef}] argument_name As data_type, …

argument_name: tên của đối số.
data_type: kiểu dữ liệu riêng của mỗi đối số.

Một số điểm cần lưu ý khi dùng ByVal và ByRef:
  • Các String luôn truyền kiểu ByVal.
  • Các cấu trúc (structure) đều được truyền bằng ByRef.
  • Các array luôn truyền bằng ByRef khi tòan bộ array được truyền cho 1 hàm. Cú pháp của Visual Basic chỉ cho phép bạn truyền phần tử đầu tiên của mảng cho 1 hàm. Tuy nhiên khi bạn truyền bằng ByRef, Visual Basic sẽ hiểu là bạn muốn truyền tòan bộ mảng.
  • Các biến kiểu số có thể truyền bằng ByVal hay ByRef tùy theo cách dùng của bạn.

data_type: Kiểu dữ liệu mà hàm trả về. Thường là kiểu Long, mắc dù 1 số hàm có thể trả về String. Hàm API chỉ hỗ trợ 1 số giới hạn các kiểu dữ liệu, sau đây là các kiểu dữ liệu có thể dùng trong các hàm API:
  • Byte : 1 số nguyên 8-bit
  • Integer : 1 số nguyên 16-bit
  • Long : 1 số nguyên 32-bit
  • String
Ngòai các kiểu dữ liệu trên, bất kỳ cấu trúc (structure) nào của API cũng có thể được dùng.

Để biết cách khai báo hàm API bạn cần khởi động tiện ích API Text Viewer được cung cấp kèm theo Visual Basic hoặc download ApiViewer 2004 và API-Guide

Sử dụng thư viện WinAPI của Autoit


Include thư viện WinAPI vào chương trình bằng dòng lệnh sau :

#include <WINAPI.au3>

Sau đó sử dụng lời gọi hàm để thực hiện các lệnh tương tác với API , các tập lềnh của WinAPI các bạn có thể tra cứu trong file Help của Autoit để tham khảo

Một ví dụ đơn giản tạo GUI trong suốt hiển thị số đếm ngược bằng API


#include <guiconstantsex.au3>
#include <Windowsconstants.au3>
#include <WINAPI.au3>
#include <Constants.au3>

Local $countdown = 3, $freq = 500

Local $gui = GUICreate("", 700, 700, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))

GUISetBkColor(0xABCDEF)
Local $lbl = GUICtrlCreateLabel('', 140, 10, 680, 680)
GUICtrlSetColor(-1, 0xff0000)
GUICtrlSetFont($lbl, 400, 800)
_WinAPI_SetLayeredWindowAttributes($gui, 0xABCDEF, 250)
_WinAPI_SetWindowLong($gui, $GWL_EXSTYLE, BitOR(_WinAPI_GetWindowLong($gui, $GWL_EXSTYLE), $WS_EX_TRANSPARENT))
GUISetState(@SW_SHOW)

For $i = $countdown To 1 Step -1

    GUICtrlSetData($lbl, $i)

    Beep($freq, 500)

    Sleep(1000)

Next