0

我想编写一个应用程序,它会自动检测并填充下图所示窗口中的文本字段:

在此处输入图像描述

(假设要输入的数据在文件中)。

问题是我的应用程序如何找到这个文本字段?

如果我能够通过程序在桌面上找到文本字段的位置,我就可以完成这项工作。

有人可以帮助我了解查找此文本字段的可能方法吗?

我在 C++ 中使用 Windows 窗体应用程序。

更新:

我玩过间谍++。
我使用 spy++ 来查找窗口句柄。我通过将查找器放在我感兴趣的窗口上来做到这一点。它以十六进制值提供句柄:00080086(实际上只是为了测试目的,我将查找器工具放在 Visual Studio 新项目页面上)。如何将此十六进制值解释为有意义的窗口名称?

见下图。在“名称”字段下进入文本字段“输入名称”的下一步是什么。

****任何示例代码都将受到高度赞赏。**

我对任何解决方案持开放态度,不一定是我如何做到这一点。

在此处输入图像描述

4

3 回答 3

2

一种解决方案是使用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 工具检查所有这些是否可行。

于 2012-06-20T12:37:12.910 回答
0

您可以枚举窗口然后找到它。为了在您的屏幕截图上探索应用程序,您可以使用与 Visual Studio 一起分发的 Spy++ (spyxx.exe)。在您的代码中,您可以使用EnumWindowsEnumChildWindows枚举所有窗口或所有子窗口以找到您需要的窗口。

于 2012-06-11T06:15:36.193 回答
0

尽管 Simon 给出的答案被接受并且是最好的答案,但我仍然为未来的访问者提供这个链接,其中包含更多关于 Windows 应用程序的 UI 自动化的描述。.

此外,对于自动化 Web 应用程序,可能需要访问此链接

于 2012-06-21T13:57:40.827 回答