检索任何窗口的所有控件及其类型和值

时间:2010-07-09 09:33:40

标签: c# c++ windows winforms winapi

我的应用程序类似于Spy ++应用程序:我希望能够自动检索活动窗口(任何应用程序)及其子项的所有不同控件,并且对于每个控件我想知道类型,名称,和值(标题或文字)。

我使用的是C#windows应用程序。

迭代前景窗口及其子窗口的所有控件(等等)并检索名称,类型和值的解决方案是什么?

3 个答案:

答案 0 :(得分:4)

要枚举顶级窗口,请使用EnumWindows(),让他们的子窗口使用EnumChildWindows()

使用枚举中的HWND,可以通过GetWindowText()读取带有标题栏值的顶级窗口,对于其他窗口,您可以使用WM_GETTEXT消息,或者正是你想要的,一个特定于windows类的消息,例如列表框的LB_GETTEXT

RealGetWindowClass()将为您提供Windows类。

Window API参考; http://msdn.microsoft.com/en-us/library/ff468919%28v=VS.85%29.aspx

答案 1 :(得分:0)

是的,如果它的窗口不属于您当前的应用程序,则必须使用Windows API。这将使您获得当前活动的窗口:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Text;

public class MainClass

    // Declare external functions.
    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

    public static void Main() {
        int chars = 256;
        StringBuilder buff = new StringBuilder(chars);

        // Obtain the handle of the active window.
        IntPtr handle = GetForegroundWindow();

        // Update the controls.
        if (GetWindowText(handle, buff, chars) > 0)
        {
            Console.WriteLine(buff.ToString());
            Console.WriteLine(handle.ToString());
        }
    }
}

它使用GetWindowText()函数来查找窗口的名称,因此我认为找到窗口的其他属性(如控件等)应该不会有问题。

答案 2 :(得分:0)

您可以使用许多Win32 API函数编写自己的Spy ++程序。 This link解释了如何在Visual Basic中编写Spy ++克隆。我知道,您可能不使用Visual Basic,但本文档确实向您展示了如何使用Win32 API复制Spy ++。将此转换为C#应该不需要太多努力。