[英]How to get text from a windows control's textbox? and how do I know it's a textbox?
我使用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(将length的值更改为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自动化之外,还有其他方法可以从此窗口获取数据吗?
我对这些东西还很陌生,但是我正在努力学习。 另外,我目前没有潜在客户,因此任何有用的评论/答案将不胜感激! 如果您确实要回答, 请务必添加有用的关键字,这样我就可以了解有关您的解决方案的更多信息
标签(即静态控件)和文本框是带有它们自己的句柄的子窗口,因此它们对于Spy ++是可见的。 如果目标窗口没有子窗口,则它不使用标签或文本框,而是在绘制文本本身,并且您将无法使用GetWindowText
或WM_GETTEXT
检索它。
文本可以通过UI Automation (屏幕阅读器使用的API)公开。 使用UISpy.exe或Inspect.exe查看文本是否可访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.