一种解决方案是使用Microsoft UI 自动化技术。自 Vista 以来,它与 Windows 一起提供了开箱即用的功能。它可以从 .NET 使用,也可以从使用 COM 的 C++ 使用。
这是一个简短的 C++ 控制台应用程序示例,它每秒显示当前位于桌面窗口中间的UI 自动化元素的类名(您可以让它运行并查看它显示的内容):
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
IUIAutomation *pAutomation; // requires Uiautomation.h
HRESULT hr = CoCreateInstance(__uuidof(CUIAutomation), NULL, CLSCTX_INPROC_SERVER, __uuidof(IUIAutomation), (LPVOID *)&pAutomation);
if (SUCCEEDED(hr))
{
RECT rc;
GetWindowRect(GetDesktopWindow(), &rc);
POINT center;
center.x = (rc.right - rc.left) / 2;
center.y = (rc.bottom - rc.top) / 2;
printf("center x:%i y:%i'\n", center.x, center.y);
do
{
IUIAutomationElement *pElement;
hr = pAutomation->ElementFromPoint(center, &pElement);
if (SUCCEEDED(hr))
{
BSTR str;
hr = pElement->get_CurrentClassName(&str);
if (SUCCEEDED(hr))
{
printf("element name:'%S'\n", str);
::SysFreeString(str);
}
pElement->Release();
}
Sleep(1000);
}
while(TRUE);
pAutomation->Release();
}
CoUninitialize();
return 0;
}
从这个示例中,您可以做的是启动您想要自动化的应用程序并查看示例是否检测到它(它应该)。
您还可以使用UISpy 工具来显示可以在目标应用程序中自动化的完整树。您应该看到此目标应用程序的窗口和其他元素(文本字段),并且您应该看到控制台应用程序示例显示的元素。
从pElement
示例中发现的内容中,您可以使用适当的条件(类名、名称、控件类型等)调用FindFirst以获取文本字段。在此文本字段中,您将使用一种应该可用的UI 自动化模式(可能是 TextPattern 或 ValuePattern)来获取或设置文本本身。
很酷的是,您可以在实际编码之前使用 UISpy 工具检查所有这些是否可行。