0

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

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 的评论吗?
  • 如何获取给定窗口句柄的类名?
  • 如何在给定窗口句柄的情况下获取窗口文本(如图所示)?
4

1 回答 1

2

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

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

您可以使用 GetClassName() winapi 函数从句柄中获取窗口类名称。

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

于 2013-06-10T11:22:24.690 回答