我們先看一下 GetWindowText 原型 (下面加過註解)

int WINAPI GetWindowText(
  __in   HWND hWnd,  // 視窗  handle
  __out  LPTSTR lpString, // 存字串的變數
  __in   int nMaxCount // 這個字串最多可以存幾個字
);

這裡有二個地方要注意,在 msdn 上看到參數有  __out 的地方,代表它是把結果存在那個變數裡面。也就是說,我在調用 GetWindowText 時要給它一個變數,執行完後,它會把結果存在該變數裡面。

第二個要注意的是,HWND hwnd 是要指定內容後才可以給它的東西,在這裡我們可以先調用 autoit 裡面的 WinGetHandle ,這樣就可以讓它成為輸入的東西。

假設我們要取得的視窗名稱是 "未命名 - 記事本" (所以請先用 cmd.exe 輸入 notepad.exe),整理後便可以這麼寫

$hwnd = WinGetHandle("未命名 - 記事本")
$result = DllCall("user32.dll", "int", "GetWindowText", "hwnd", $hwnd, "str", "", "int", 32768)

那我們要怎麼從知道這視窗的標題文字?

嗯,別忘了 $result 的功用 - $result[0] 代表的就是傳回結果,這裡傳回值指的是那個視窗文字的長度;$result[1] 是 hwnd,那是一個 16 進制的整數; $result[2] 就是我們要的  - 那個視窗的文字內容。可以再輸出下面指令便可知

msgbox(0, "", $result[0])   ; 返回字元數量
msgbox(0, "", $result[2])   ; 在 param 2 的返回文字

假設我們要找的 window  標題是 "未命名 - 記事本" (所以請先在 cmd.exe 輸入 notepad.exe),一般在 C 語言調用的時候,通常第二個參數不會給它值。所以 autoit 要調用的話我們可以很快寫出來

$Result = DllCall ("user32.dll", "FindWindow", "hwnd", "str", "未命名 - 記事本", "str", "") 

$hwnd = WinGetHandle("未命名 - 記事本")
$result = DllCall("user32.dll", "int", "GetWindowText", "hwnd", $hwnd, "str", "", "int", 32768)
msgbox(0, "", $result[0])   ; 返回字元數量
msgbox(0, "", $result[2])   ; 在 param 2 的返回文字

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