我正在创建一个函数来查找给定窗口层次结构的特定窗口,如下所示:
protected bool MapWindowHierarchy (ATS.Library.Window window)
{
bool result = false;
List<Process> processes = null;
processes = GetProcesses().ToList();
processes.ForEach
(
process =>
{
if (process.MainWindowHandle == window.Handle)
{
// Populate window properties.
// Get child windows with filled properties.
}
}
);
return (result);
}
protected bool MapWindowHierarchy (List<ATS.Library.Window> windows)
{
return (windows.All(window => this.MapWindowHierarchy(window)));
}
public sealed class Window
{
public IntPtr Handle { get; set; }
public string Class { get; set; }
public Rectangle Bounds { get; set; }
public Win32Api.User32.ShowWindowCommands WindowState { get; set; }
public string Caption { get; set; }
public int Style { get; set; }
public List<ATS.Library.Window> Windows { get; set; }
public void PopulateFromHandle(IntPtr hWnd)
{
// Populate above properties using Win32 API.
}
}
这只是粗略的代码,但目标是使用[Window]
类创建层次结构并查看使用的实际层次结构是否[EnumChildWindows]
匹配。这显然工作正常,但我遇到了这个 SO 问题,Hans Passant 的评论"Every unique window in a desktop session must have a unique Windows class name"
,我不知道如何解释它(参见下图以获取具有相同类名的多个窗口)。也许他提到的仅适用于托管代码(WinForms、WPF 等)。
此外,我不确定如何检索窗口的类名和文本,因为我有 Spy++ 的句柄(hWnd)(见下图)。请注意如何在树视图中检索文本,而不是在[Find Window]
对话框中检索文本。
问题:
- 由于我只针对本机应用程序,我应该担心 Han 的评论吗?
- 如何获取给定窗口句柄的类名?
- 如何在给定窗口句柄的情况下获取窗口文本(如图所示)?