我已经使用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自动化之外,还有其他方法从此窗口获取数据吗?
我对这些东西很新,但我正在努力学习。此外,我没有当前的线索所以任何有用的评论/答案将不胜感激! 如果您确实回答请确保包含有用的关键字,以便我能够了解有关您的解决方案的更多信息
答案 0 :(得分:1)
标签(即静态控件)和文本框是具有自己的句柄的子窗口,因此它们对Spy ++是可见的。如果您的目标窗口没有子项,则表示它没有使用标签或文本框,它正在绘制文本本身,您将无法使用GetWindowText
或WM_GETTEXT
检索它。
文字可能会通过屏幕阅读器使用的UI Automation公开。使用UISpy.exe or Inspect.exe查看文本是否可访问。