微軟Windows應用編程接口(API)為開發Windows應用程序提供了很多構建好的模塊。它提供各種操作方法,比如獲取鼠標坐標,窗口句柄,顏色等。QTP支持調用動態鏈接庫內定義的這些方法,但是由于VBScript的限制,只有有限的一部分API可以在QTP中使用。
本章使用的API的更多細節和信息可以從MSDN或者Visual Studio的API Viewer工具查詢獲得。
Extern對象
QTP提供一個Extern功能對象用來聲明和調用API。
語法
Extern.Declare (RetType, MethodName, LibName, Alias [, ArgType(s)]) |
更多細節可參考QTP用戶手冊。
VB API定義語法
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long |
對以上API,我們需要使用QTP的Declare方法確定使用的合適參數:
RetType = micLong(函數返回類型)
MethodName = "GetForegroudWindow" (我們可以使用任何其他名字,但是比較好的做法是使用實際API的名字)
LibName = "user32.dll" (如果不是使用Windows系統自帶的DLL,那么文件名必須使用絕對路徑,例如"C:\MyApp\Lib\mylib.dll")
Alias = "" 或者"GetForegroudWindow"(如果MethodName跟Alias相同,則Alias可以為空值。
ArgType(s) = 本例中不需要傳入參數)。
QTP API定義
Extern.Declare micLong,"GetForegroundWindow","user32.dll","GetForegroundWindow" |
以下用一些用例來演示使用API解決通常遇到的問題。
問題 17-1.如何判斷當前桌面最上面的為瀏覽器窗口
'聲明GetForeGroundWindow API extern.Declare micLong,"GetForegroundWindow","user32.dll","GetForegroundWindow"
'獲取最前面窗口的句柄 hwnd = extern.GetForegroundWindow()
'判斷是否有包含此句柄的瀏覽器窗口 isBrowser = Browser("hwnd:=" &hwnd).Exist() If isBrowser then Msgbox "The top most window is a browser" End if |
問題 17-2.如何獲得Windows的環境變量 (注意不是QTP環境變量)
'變量聲明 Dim s_EnvValue
'聲明 API "GetEnvironmentVariable" Extern.Declare micLong,"GetEnvironmentVariable","kernel32.dll","GetEnvironmentVariableA", _ micString,micString+micByRef,micLong
'獲取全局變量 "TEMP" 值 Extern.GetEnvironmentVariable "TEMP",s_EnvValue,255 '會得到臨時目錄路徑 MsgBoxs_EnvValue |
問題 17-3.如何使用Windwos API選中Listbox里的選項(item)
' 聲明API Extern.Declare micLong,"SendMessage","user32.dll","SendMessageA",micLong,micLong,micLong,micLong
' 設置Listbox選項item的消息 Const LB_SETSEL = &H185
'方法:根據index選中復選框 Function CheckListBox(hwnd, index) extern.SendMessagehwnd, LB_SETSEL, True, index end function
'方法:根據index取消選中復選框 Function UnCheckListBox(hwnd, index) extern.SendMessagehwnd, LB_SETSEL, False, index end function |
問題 17-4.如何取到一個文本框的背景色 (當驗證必填項跟可選項底色不同時可用到)
'聲明需要的 API Extern.Declare micLong,"GetPixel","gdi32","GetPixel",micLong,micLong,micLong Extern.Declare micLong,"GetWindowDC","user32","GetWindowDC",micLong Extern.Declare micLong,"ReleaseDC","user32","ReleaseDC",micLong,micLong Extern.Declare micLong,"GetDC","user32","GetDC",micLong Extern.Declare micLong,"SetForegroundWindow","user32","SetForegroundWindow",micLong
Dim hDCSource Dim hWndSource Dim backColor '取得控件的句柄 hWndSource = Window("Window").WinEdit("MandatoryField1").GetROProperty("hwnd")
'將窗口置于最上面,因為GetPixel方法只能針對可見像素使用 extern.SetForegroundWindowhWndSource
'取得設備上下文句柄 hDCSource = Clng(Extern.GetDC(hWndSource))
'取得相關控件的像素(1,1)點的背景色 backColor = Clng(Extern.GetPixel(hDCSource, Clng(1),Clng(1))) MsgBoxbackColor
'釋放設備上下文句柄 Extern.ReleaseDChWndSource, hDCSource |
問題 17-5.如何使用Windows API模擬鍵盤操作
'聲明API:鍵盤事件keybd_event extern.Declare micVoid,"keybd_event","user32" ,"keybd_event", _ micbyte,micbyte,miclong,miclon '聲明API:虛擬按鍵碼映射MapVirtualKey extern.Declare micLong,"MapVirtualKey","user32","MapVirtualKeyA", _ micLong, micLong
Const KEYEVENTF_EXTENDEDKEY = &H1 Const KEYEVENTF_KEYUP = &H2 Const KEYEVENTF_KEYDOWN = &H0
Sub KeyDown(KeyAscii) keyCode = extern.MapVirtualKey(KeyAscii, 0) '觸發按鍵按下事件 extern.keybd_eventKeyAscii, keyCode, KEYEVENTF_KEYDOWN, 0 End Sub
Sub KeyUp(KeyAscii) keyCode = extern.MapVirtualKey(KeyAscii, 0) '觸發按鍵抬起事件 extern.keybd_eventKeyAscii, keyCode, KEYEVENTF_KEYUP, 0 End Sub
Sub KeyPress(KeyAscii) KeyDownKeyAscii KeyUpKeyAscii End Sub |
對“計算器”使用以上代碼
'聲明鍵值常量 Const vbKey1 = 49 Const vbKey2 = 50 ConstvbKeyAdd = 107 ConstvbKeyReturn = 13
SystemUtil.Run"calc.exe" Window("title:=Calculator").Activate Call KeyPress(vbKey1) Call KeyPress(vbKeyAdd) Call KeyPress(vbKey2) Call KeyPress(vbKeyReturn) |
使用以上代碼模擬CTRL+ALT+S
'聲明鍵值常量 ConstvbKeyControl = 17 ConstvbKeyAlt = 18 ConstvbKeyS = 83
Call KeyDown(vbKeyControl) Call KeyDown(vbKeyAlt) Call KeyDown(vbKeyS) Call KeyUp(vbKeyS) Call KeyUp(vbKeyAlt) Call KeyUp(vbKeyControl) |
問題 17-4.如何取到一個文本框的背景色 (當驗證必填項跟可選項底色不同時可用到)
'聲明需要的 API Extern.Declare micLong,"GetPixel","gdi32","GetPixel",micLong,micLong,micLong Extern.Declare micLong,"GetWindowDC","user32","GetWindowDC",micLong Extern.Declare micLong,"ReleaseDC","user32","ReleaseDC",micLong,micLong Extern.Declare micLong,"GetDC","user32","GetDC",micLong Extern.Declare micLong,"SetForegroundWindow","user32","SetForegroundWindow",micLong
Dim hDCSource Dim hWndSource Dim backColor '取得控件的句柄 hWndSource = Window("Window").WinEdit("MandatoryField1").GetROProperty("hwnd")
'將窗口置于最上面,因為GetPixel方法只能針對可見像素使用 extern.SetForegroundWindowhWndSource
'取得設備上下文句柄 hDCSource = Clng(Extern.GetDC(hWndSource))
'取得相關控件的像素(1,1)點的背景色 backColor = Clng(Extern.GetPixel(hDCSource, Clng(1),Clng(1))) MsgBoxbackColor
'釋放設備上下文句柄 Extern.ReleaseDChWndSource, hDCSource |
問題 17-5.如何使用Windows API模擬鍵盤操作
'聲明API:鍵盤事件keybd_event extern.Declare micVoid,"keybd_event","user32" ,"keybd_event", _ micbyte,micbyte,miclong,miclon '聲明API:虛擬按鍵碼映射MapVirtualKey extern.Declare micLong,"MapVirtualKey","user32","MapVirtualKeyA", _ micLong, micLong
Const KEYEVENTF_EXTENDEDKEY = &H1 Const KEYEVENTF_KEYUP = &H2 Const KEYEVENTF_KEYDOWN = &H0
Sub KeyDown(KeyAscii) keyCode = extern.MapVirtualKey(KeyAscii, 0) '觸發按鍵按下事件 extern.keybd_eventKeyAscii, keyCode, KEYEVENTF_KEYDOWN, 0 End Sub
Sub KeyUp(KeyAscii) keyCode = extern.MapVirtualKey(KeyAscii, 0) '觸發按鍵抬起事件 extern.keybd_eventKeyAscii, keyCode, KEYEVENTF_KEYUP, 0 End Sub
Sub KeyPress(KeyAscii) KeyDownKeyAscii KeyUpKeyAscii End Sub |
對“計算器”使用以上代碼
'聲明鍵值常量 Const vbKey1 = 49 Const vbKey2 = 50 ConstvbKeyAdd = 107 ConstvbKeyReturn = 13
SystemUtil.Run"calc.exe" Window("title:=Calculator").Activate Call KeyPress(vbKey1) Call KeyPress(vbKeyAdd) Call KeyPress(vbKey2) Call KeyPress(vbKeyReturn) |
使用以上代碼模擬CTRL+ALT+S
'聲明鍵值常量 ConstvbKeyControl = 17 ConstvbKeyAlt = 18 ConstvbKeyS = 83
Call KeyDown(vbKeyControl) Call KeyDown(vbKeyAlt) Call KeyDown(vbKeyS) Call KeyUp(vbKeyS) Call KeyUp(vbKeyAlt) Call KeyUp(vbKeyControl) |