我想检查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;
}
现在我必须找出,列表中的哪个是按钮。 谢谢
答案 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;
进行比较