在测试步骤中使用 Windows API
相关项: GUI 操作、脚本化 GUI 组件和函数库
-
在 MSDN 中,查找您要使用的函数。
-
阅读其文档,并了解所有必需参数和返回值。
-
注意 Windows API 函数的位置。Windows API 函数位于 Windows DLL 内。请求的函数所在的 .dll 的名称通常与函数文档中的“导入库”部分相同。例如,如果文档引用了 User32.lib,则函数位于名为 User32.dll 的 .dll 中,通常位于 System32 库中。
-
使用 UFT One Extern 对象声明外部函数。
以下示例声明了对名为 GetForegroundWindow 的函数(位于 user32.dll 中)的调用:
extern.declare micHwnd, "GetForegroundWindow", "user32.dll", "GetForegroundWindow" -
调用声明的函数,调用时传递任何必需的参数,例如:
hwnd = extern.GetForegroundWindow()在此示例中,检索前景窗口句柄。如果前景窗口不在对象存储库中或无法预先确定(例如,具有动态标题的窗口),这会很有用。可能希望将此句柄用作窗口的编程描述的一部分,例如:
Window("HWND:="&hWnd).Close
在某些情况下,可能必须将预定义的常量值用作函数参数。由于这些常量不在操作、脚本化组件或函数上下文中定义,您需要查找其数字值以便将它们传递给被调用的函数。通常在函数的头文件中声明这些常量的数字值。还可以在每个函数文档中的“头”部分下面找到对头文件的引用。如果计算机上安装了 Microsoft Visual Studio,则通常可以在 X:\Program Files\Microsoft Visual Studio\VC98\Include 下找到头文件。
例如,GetWindow 函数预期接收到代表指定窗口和要检索的句柄所在的窗口之间的关系的数字值。在 MSDN 文档中,可以查找常量: GW_CHILD、GW_ENABLEDPOPUP、GW_HWNDFIRST、GW_HWNDLAST、GW_HWNDNEXT、GW_HWNDPREV 和 GW_HWNDPREV。
如果打开 GetWindow 文档中提到的 WINUSER.H 文件,将找到以下标志值:
/*
* GetWindow() Constants
*/
#define GW_HWNDFIRST 0
#define GW_HWNDLAST 1
#define GW_HWNDNEXT 2
#define GW_HWNDPREV 3
#define GW_OWNER 4
#define GW_CHILD 5
#define GW_ENABLEDPOPUP 6
#define GW_MAX 6
示例: 以下示例在记事本应用程序中检索特定菜单项的值:
' Constant Values:
const MF_BYPOSITION = 1024
' Windows API Functions Declarations
Extern.Declare micHwnd,"GetMenu","user32.dll","GetMenu",micHwnd
Extern.Declare micInteger,"GetMenuItemCount","user32.dll","GetMenuItemCount",micHwnd
Extern.Declare micHwnd,"GetSubMenu","user32.dll","GetSubMenu",micHwnd,micInteger
Extern.Declare micInteger,"GetMenuString","user32.dll","GetMenuString",micHwnd,micInteger, micString+micByRef,micInteger,micInteger
' Notepad.exe
hwin = Window("Notepad").GetROProperty ("hwnd")' Get Window's handle
MsgBox hwin
' Use Windows API Functions
men_hwnd = Extern.GetMenu(hwin)' Get window's main menu's handle
MsgBox men_hwnd
item_cnt = Extern.GetMenuItemCount(men_hwnd)
MsgBox item_cnt
hSubm = Extern.GetSubMenu(men_hwnd,0)
MsgBox hSubm
rc = Extern.GetMenuString(hSubm,0,value,64,MF_BYPOSITION)
MsgBox value

