基本上 AutoIt 要調用 dll ,就一定離不開 msdn 查 api ,但對沒程式經驗或只碰過 autoit 的人可能也看不懂,先跟各位說 msdn 的 網址 ,以後會常用到。我們先來看一個簡單的 SetCursorPos ,這個函式是用來設定 mouse 位置。
BOOL WINAPI SetCursorPos(
__in int X,
__in int Y
);
你在 MSDN 上說明這個函式的 頁面 往下拉,你會發現它是 user32.dll 裡面,這個很重要, autoit 要調用 win32 api 函式前一定要先知道它放在哪個 dll 裡面。這裡要開始解說了。
1. BOOL WINAPI SetCursorPos - 事實上那個 WINAPI 是為了避免以後相容性的問題在做的,那個就不要理它了。它的傳回值就是 BOOL;而函式名稱就是 SetCursorPos。
2. __in int X - 這裡先說明,真正的資料型態絕對不會是底線開頭,所以看到底線就跳過去。但這裡的 __in 卻是給我們重要的資訊。它是跟我說,後面的X 是一個 「輸入性質」的變數,而那個 int 才是 X 真正的資料型態。
3. __in int Y - 上面會這個就會了,Y 的資料型態是 int ,它是輸入性質。
如果我用 C 語言去調用 SetCursorPos 的話會是這麼寫
SetCursorPos(int(10), int(20));
當然上面那些 int 是為了下面方便比對硬加上去的,這會把 mouse position 設到位置 (10, 20)。至於用 AutoIt 調用它的話是件簡單的事 (因為這個函式沒有難度),直接就使用 DllCall
$Result = DllCall("user32.dll", "BOOL", "SetCursorPos", "int", 10, "int", 20)
我們先把它轉得清楚一點好了
$Result = DllCall( DLL 名稱, 函式傳回值, 函式名稱, 第一個資料型態, 第一個資料內容, 第二個資料型態, 第二個資料內容, ...)
這樣對著看應該清楚多了吧?接下來應該沒什麼要繼續講的。重點是那個 $Result 是幹嘛的。
我們剛剛也看過 SetCursorPos 的原型了,輸入的參數有二個,在用 Dll 呼叫後,它會把裡面的參數都在存到 $Result 裡面。因為剛剛的輸入參數是 2 個 - int x, int y。所以 $Result[1] = x = 10; $Result[2] = y = 20,索引從 1 開始跳。至於 $Result[0] 本身代表我們調用的 win32 API 它的返回值。這個 $Result 很重要,對於一些其它的 API 要用它來看執行結果,現在先知道它的用法就好。
-------------------------------------------------------------------------------------------
接著跟各位說另一個比較難一點的 win32 API - MessageBox;這個函式就和 autoit 的 MsgBox 沒二樣,我們來看它的原型
int WINAPI MessageBox(
__in_opt HWND hWnd,
__in_opt LPCTSTR lpText,
__in_opt LPCTSTR lpCaption,
__in UINT uType
);
嗯,這次不用說太多了,直接把結論寫出來
1. 函式名稱:MessageBox
2. 傳回值:int
3. 輸入引數型態:HWND、LPCTSTR、LPCTSTR、UINT
這裡要說明的是輸入引數部份,
HWND 是一個視窗的代號,autoit 對應它的資料型態用 "hwnd";
LPCTSTR 指的是你要輸入的一大串文字,只要是字串的東西,autoit 就用 "str" 帶過去;
UINT 代表的是無號數,它在 MessageBox 是決定那個訊息盒長怎樣,所以你可以塞給它一個數字就行了(如果要查明數字代表怎樣的訊息盒,就到 這個 頁面 查)
好了,於是我們又可以調用了,再把 autoit 的 DllCall 原型寫出來一次
$result = DllCall( DLL 名稱, 函式傳回值, 函式名稱, _
第一個資料型態, 第一個資料內容, 第二個資料型態, 第二個資料內容, ...)
代進去之後就變成
$result = DllCall("user32.dll", "int", "MessageBox", _
"hwnd", 0, "str", "標題文字", "str", "顯示內容", "int", 0)
嗯,這次就先介紹到這裡
-------------------------------------------------------------------------------------------
接下來會有一堆問題,我怎麼知道 win32 api 哪個資料型態要對應到 autoit 哪個資料型態?
嗯,事實上 autoit 上的 manual 有列出一些了,在 C 語言裡面的一些資料型態述敘如下
類型 | 細節內容 |
none(或 void) | 無數值 (僅作用於無返回值函數的返回類型,跟 C 語言類似)。 |
byte | 8 位元整數。 |
ubyte | 無帶符號的 8 位元整數。 |
short | 16 位元整數。 |
ushort | 無帶符號的 16 位元整數。 |
dword | 無帶符號的 32 位元整數。 |
udword | 無帶符號的 32 位元整數。 |
int | 32 位元整數。 |
uint | 無帶符號的 32 位元整數。 |
long | 32 位元整數。 |
ulong | 無帶符號的 32 位元整數。 |
int64 | 64 位元整數。 |
uint64 | 無帶符號的 64 位元整數。 |
str | 一個 ANSI 字串 (不能多於 65536 字元)。 |
wstr | 一個 UNICODE 寬字元文字 (當呼叫需要時須轉換 為/來自 的 ANSI 文字),不能多於 65536 字元。 |
hwnd | 視窗控制碼 (指標)。 |
ptr | 通用指標 (void *)。 |
float | 單精度浮點指標數值。 |
double | 雙精度浮點指標數值。 |
lresult/int_ptr/long_ptr | 當於 x86 或 x64 的 AutoIt 版本下執行時,大小足夠用以支援指標的整數。 |
lparam/int_ptr/long_ptr | 當於 x86 或 x64 的 AutoIt 版本下執行時,大小足夠用以支援指標的整數。 |
wparam/uint_ptr/ulong_ptr | 當於 x86 或 x64 的 AutoIt 版本下執行時,大小足夠用以支援指標的無帶符號整數。 |
* | 新增 * 符號到其它類型結尾以透過關聯傳遞。例如 "int*" 傳遞指標到某個 "int" 類型。 |
上面這個在 官網 上定義更清楚。而部份的替換如下
WINDOWS API 類型 | AutoIt 類型 |
LPCSTR/LPSTR | str |
LPCWSTR/LPWSTR | wstr |
LPVOID | ptr |
HWND | hwnd |
WPARAM | wparam |
LPARAM | lparam |
DWORD | dword |
LPDWORD | dword* |
HANDLE/HINSTANCE | ptr |
LONGLONG/LARGE_INTEGER | int64 |
ULONGLONG/ULARGE_INTEGER | uint64 |
UINT_PTR | wparam |
LONG_PTR | lparam |
至於有些沒看過的,有些可以去 try-error,或是再去找找它的真正代表函意,再給它適當的對應。
這篇暫時就到這。