0

我使用 spy++ 来找到所需 Windows 控件的正确句柄,该控件属于不受管理的独立应用程序。请注意,spy++“属性检查器”提到此窗口没有任何子(或父)窗口。

我还设法使用以下代码取回窗口的名称:

   //the invokes are included aswell
    const int WM_GETTEXT = 0x000D;
    static void Main(string[] args)
    {
        IntPtr handle = new IntPtr(Convert.ToInt32("00070818", 16)); 
        int nChars = GetWindowTextLength(handle); //win32 function
        int length = 200;
        StringBuilder sb = new StringBuilder(length);
        SendMessage(handle, WM_GETTEXT, length, sb);
        Console.WriteLine(sb.ToString());           

    }

这个窗口比它的标题有更多的信息,这就是我似乎用 WM_GETTEXT 得到的所有信息(将长度的值更改为 200 没有帮助,无论如何都是一个长镜头)。

接下来,我尝试了一种使用 UI 自动化的不同方法:

static void Main(string[] args)
{
    AutomationElement target = AutomationElement.FromHandle(handle);
    TextPattern textPattern = target.GetCurrentPattern(TextPattern.Pattern) as TextPattern;
}

但我得到了这个错误:

UIAutomationClient.dll 中出现“System.InvalidOperationException”类型的未处理异常

附加信息:不支持的模式。

最重要的是,我也尝试过使用 Microsoft Inspect.exe,但在 UI 自动化和 MSAA 模式下,它都无法专注于窗口中的文本。


是不是说数据不能用 UI 自动化实现??还是我应该只是使用错误的方法/类型?

除了使用 GetWindowText、WM_GETTEXT 或 UI 自动化之外,还有其他方法可以从此窗口获取数据吗?

我对这些东西还很陌生,但我正在努力学习。此外,我没有当前的潜在客户,因此非常感谢任何有用的评论/答案!如果您确实回答,请务必包含有用的关键字,以便我能够了解有关您的解决方案的更多信息

4

1 回答 1

2

标签(即静态控件)和文本框是具有自己句柄的子窗口,因此它们对 Spy++ 可见。如果您的目标 Window 没有子窗口,则它没有使用标签或文本框,它正在绘制文本本身,您将无法使用GetWindowTextor检索它WM_GETTEXT

文本可能会通过UI Automation(屏幕阅读器使用的 API)公开。使用UISpy.exe 或 Inspect.exe查看文本是否可访问。

于 2013-02-25T00:42:55.680 回答