我的应用程序类似于Spy ++应用程序:我希望能够自动检索活动窗口(任何应用程序)及其子项的所有不同控件,并且对于每个控件我想知道类型,名称,和值(标题或文字)。
我使用的是C#windows应用程序。
迭代前景窗口及其子窗口的所有控件(等等)并检索名称,类型和值的解决方案是什么?
答案 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#应该不需要太多努力。