如何从Windows控件的文本框中获取文本?我怎么知道它是一个文本框?

时间:2013-02-25 00:20:12

标签: c# winapi ui-automation sendmessage windows-controls

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

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

   //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 Automation的不同方法:

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 Automation实现数据?或者我应该使用错误的方法/类型?

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

我对这些东西很新,但我正在努力学习。此外,我没有当前的线索所以任何有用的评论/答案将不胜感激! 如果您确实回答请确保包含有用的关键字,以便我能够了解有关您的解决方案的更多信息

1 个答案:

答案 0 :(得分:1)

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

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