在VS2015中,可以通过API函数获取Windows窗口中控件的信息,包括控件句柄、控件显示的文字以及控件类型等。其流程为,首先获取Windows指定窗口的句柄,之后通过回调函数遍历该窗口中的控件句柄,最后通过控件句柄获取控件文字及类型。
1 获取窗口句柄
可以通过FindWindow()函数获取指定窗口的句柄。该函数的格式为
HWND FindWindowA(
LPCSTR lpClassName
, LPCSTR lpWindowName
);
其中,参数lpClassName指定了窗口所属的类名;lpWindowName指定了窗口的标题。如果函数执行成功,则返回指定窗口的句柄,否则返回值是NULL。
通过FindWindow()函数,有两种方法获取指定窗口句柄。一种方法是指定窗口所属的类名称,另外一种是指定窗口的标题。例如,在Windows中,可以通过鼠标右键可以查看某个文件的属性,该属性窗口为图1所示。
图1 png文件属性窗口
可以通过以下代码获取该窗口的句柄
HWND hwnd;
hwnd = FindWindow(NULL, L"图片1.png 属性");
其中,HWND是窗口句柄类型,FindWindow()函数的第一个参数是NULL,第二个参数指定了窗口的标题,即通过窗口标题查找窗口。
2 遍历窗口控件。
如果成功获取了指定窗口句柄,接下来调用API函数EnumChildWindows()函数开始遍历控件。
2.1 EnumChildWindows()函数
该函数的格式为
BOOL EnumChildWindows(
HWND hWndParent
, WNDENUMPROC lpEnumFunc
, LPARAM lParam
);
其中参数hWndParent是指定窗口的句柄;lpEnumFunc是一个系统定义好的回调函数,系统会将窗口中每个控件的句柄依次给这个回调函数,并依次调用该回调函数。在lpEnumFunc回调函数中通过控件的句柄获取控件的信息;lParam是传递给回调函数的参数。如果每次调用回调函数成功,则EnumChildWindows()函数直到所有的控件都被遍历后才会返回TRUE,如果回调函数调用失败,则EnumChildWindows()函数直接返回FALSE。