我正在创建一个函数来查找给定窗口层次结构的特定窗口,如下所示:
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]
的实际层次结构是否匹配。这显然工作正常,但我遇到了this SO question,Hans Passant的评论"Every unique window in a desktop session must have a unique Windows class name"
,我不知道如何解释它(请参阅下面的图片,了解具有相同类名的多个窗口)。也许他提到的只适用于托管代码(WinForms,WPF等)。
此外,我不知道如何检索窗口的类名和文本,因为我有像Spy ++那样的句柄(hWnd)(见下图)。请注意如何在树视图中检索文本,而不是[Find Window]
对话框。
问题:
答案 0 :(得分:2)
不确定为什么你要担心。但是,您在屏幕截图中突出显示的这些“按钮”控件是不是独特的窗口。当您单击它们时,它们看起来都一样,行为完全相同。唯一的区别是他们的文字“财产”是不同的。所以它们就是完全相同的窗口“类”。由于winapi是C api而C语言不支持类或属性,因此双引号中的“property”和“class”。
窗口类预先选择窗口的一堆属性,你可以在WNDCLASSEX structur e中看到它们,你在调用RegisterClassEx()之前填写的那个。然后,您可以从中创建窗口,在CreateWindowEx()winapi调用中传递类名。该方案旨在使创建类似的窗口变得容易,就像在C#中使用类来创建类似的对象一样。但仍然可以拥有自己的Text属性。以及他们自己的Click事件处理程序。
您可以从具有GetClassName()winapi函数的句柄中获取窗口类名称。
使用GetWindowText()winapi函数从句柄中获取文本“property”。 GetWindowTextLength()告诉你需要传递给GetWindowText()的字符串缓冲区有多大。