zhaicheng 发表于 2011-8-10 21:47:18

【已解决】autoit调用api初级教程【转】

本帖最后由 zhaicheng 于 2011-8-15 19:31 编辑

基本上 AutoIt 要調用 dll ,就一定離不開 msdn 查 api ,但對沒程式經驗或只碰過 autoit 的人可能也看不懂,先跟各位說 msdn 的網址 ,以後會常用到。我們先來看一個簡單的 SetCursorPos ,這個函式是用來設定 mouse 位置。

BOOL WINAPI SetCursorPos(
__inint X,
__inint Y
);

你在 MSDN 上說明這個函式的 頁面 往下拉,你會發現它是 user32.dll裡面,這個很重要, autoit 要調用 win32 api 函式前一定要先知道它放在哪個 dll 裡面。這裡要開始解說了。

1. BOOL WINAPISetCursorPos - 事實上那個 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 = x = 10; $Result = y = 20,索引從 1 開始跳。至於 $Result 本身代表我們調用的 win32 API 它的返回值。這個 $Result 很重要,對於一些其它的 API 要用它來看執行結果,現在先知道它的用法就好。

-------------------------------------------------------------------------------------------

接著跟各位說另一個比較難一點的 win32 API - MessageBox;這個函式就和autoit的 MsgBox 沒二樣,我們來看它的原型

int WINAPI MessageBox(
__in_optHWND hWnd,
__in_optLPCTSTR lpText,
__in_optLPCTSTR 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,或是再去找找它的真正代表函意,再給它適當的對應。

這篇暫時就到這。

abc... 发表于 2011-8-11 10:36:10

~{0%Q=#,71Le?4WE:C@[!#~}

浪迹红客 发表于 2011-8-16 23:19:32

语言有很大的不同,呵呵

leon460 发表于 2011-8-17 12:56:54

你太好了,我正要真个相关的东西,太感谢了,。

hongewuyan 发表于 2011-8-18 16:20:37

很实用,非常感谢。

都市浪子666 发表于 2011-8-20 17:42:20

先做个记号,日后再来学习,

syhw2222 发表于 2012-1-23 22:38:15

谢谢楼主分享!

_LK_一生所爱 发表于 2012-1-28 16:43:58

非常感谢LZ!!!!!!!!!!!!!!!!!!!

cgqmj 发表于 2012-3-11 11:52:08

复习一下!!!!!!!!!

umprie 发表于 2012-3-13 08:17:10

學習了,謝謝。

lisappy 发表于 2012-3-22 17:37:30

要是能转化为简体中文就好了,这样看着很累

annybaby 发表于 2012-11-8 21:56:13

搜索到这里了,很好的解释~~

edisonx 发表于 2012-11-9 10:22:46

回复 12# annybaby


    這篇文章是轉自小弟的 blog ,    ( 出處被摘掉還真有點... 嗯 ...)

   小弟曾寫下 AutoIt About Dll 9 篇文與 13 篇 Note,

   Dll 9 篇: http://edisonx.pixnet.net/blog/category/list/2035962

  這篇是屬其中第二篇   AutoIt!! 第一個Dll (幼幼班)

跃逸冰颠 发表于 2012-12-6 19:39:47

谢谢楼主分享

524443834 发表于 2012-12-7 14:09:40

非常感谢啊,,,又稍微懂了点类型的知识{:face (356):}
页: [1]
查看完整版本: 【已解决】autoit调用api初级教程【转】