C#中的本地窗口层次结构和类名

我正在创build一个函数来查找给定窗口层次结构的特定窗口,如下所示:

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]类创build层次结构,并查看使用[EnumChildWindows]的实际层次结构是否匹配。 这显然工作正常,但我碰到这个问题 ,Hans Passant的评论"Every unique window in a desktop session must have a unique Windows class name" ,我不知道如何解释它(参见下图相同的类名)。 也许他所提到的只适用于托pipe代码(WinForms,WPF等)。

此外,我不知道如何检索窗口的类名和文本,因为我有像Spy ++那样的句柄(hWnd)(见下图)。 注意如何在树视图中检索文本,而不是[Find Window]对话框。

间谍++

题:

  • 我应该担心韩的评论,因为我只是针对本地应用程序?
  • 如何获得给定窗口句柄的类名?
  • 如何获得窗口的文本给定一个窗口的句柄(如在图像中)?

Solutions Collecting From Web of "C#中的本地窗口层次结构和类名"

不知道为什么你要担心。 但是,在屏幕截图中突出显示的这些“按钮”控件并不是唯一的窗口。 当你点击它们时,它们看起来都一样,行为也完全一样。 唯一的区别是他们的文本“属性”是不同的。 所以他们是完全一样的窗口“班级”。 由于winapi是C api,而C语言不支持类或属性,因此在双引号中使用“property”和“class”。

一个窗口类为一个窗口预先选择了一堆属性,你可以在你调用RegisterClassEx()之前在WNDCLASSEX结构中看到它们。 然后你创建窗口,在CreateWindowEx()winapi调用中传递类名称。 该方案旨在使创建类似的窗口变得容易,就像在C#中使用类来创建类似的对象一样。 但是仍然可以拥有自己的Text属性。 和他们自己的Click事件处理程序。

您从GetClassName()winapi函数的句柄中获得窗口类的名称。

您使用GetWindowText()winapi函数从句柄中获取文本“属性”。 GetWindowTextLength()告诉你需要传递给GetWindowText()的字符串缓冲区有多大。