检查hWnd是否是一个按钮

时间:2015-04-10 14:09:49

标签: c# winapi

我想检查hWnd是否是一个按钮。

此代码用于获取hWnd:

public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);

[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);


public static List<IntPtr> GetChildWindows(IntPtr parent)
{
    List<IntPtr> result = new List<IntPtr>();
    GCHandle listHandle = GCHandle.Alloc(result);
    try
    {
        EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
        EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
    }
    finally
    {
        if (listHandle.IsAllocated)
            listHandle.Free();
    }
    return result;
}

现在我必须找出,列表中的哪个是按钮。 谢谢

3 个答案:

答案 0 :(得分:3)

Windows按钮具有窗口类BUTTON。您可以使用GetClassName来发现按钮是否为按钮。

请注意,现在很多应用都没有使用Windows控件,因此可能会有一个不使用BUTTON类的按钮。一些应用程序(例如网络浏览器或WPF应用程序)甚至完全是#34;所有者绘制的#34;并且根本不使用任何窗口控件(&#34;容器&#34;窗口除外)。

曾几何时,有一个非常有用的工具Spy ++来检查窗口。理解程序的UI是如何构建的非常有用。嗯......仍然存在于Visual Studio中:在我的机器上(Visual Studio 2013): C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ Tools \ spyxx.exe

答案 1 :(得分:1)

您可以使用&#34; GetClassName&#34;找出hwnd的win32级。对于标准的win32按钮,它将永远是按钮&#39;。您可以这样使用它:

public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName,int nMaxCount);

[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);

public static List<IntPtr> GetChildButtons(IntPtr parent)
{
    List<IntPtr> result = new List<IntPtr>();
    GCHandle listHandle = GCHandle.Alloc(result);
    try
    {
        EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
        EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
    }
    finally
    {
        if (listHandle.IsAllocated)
            listHandle.Free();
    }
    return result
        .Where(x => {
            StringBuilder buffer = new StringBuilder(128);
            GetClassName(x, buffer, buffer.Capacity);
            return buffer.ToString() == "Button";
        })
        .ToList();
}

答案 2 :(得分:0)

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName,int nMaxCount);

将班级名称与&#34;按钮&#34;

进行比较