基本上 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,或是再去找找它的真正代表函意,再給它適當的對應。

這篇暫時就到這。

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()