通过findwindowwex获取所有控件
get all controls by FindWindowEx
我正在构建一个应用程序,它将得到所有的控制进入应用程序winform正在运行。首先,我可以将dll注入到正在运行的应用程序中,并获得正在运行的应用程序的句柄。在我将所有子窗口放入应用程序之后。接下来,我想通过findwindowwex将所有控件放入子窗口。但我不能
代码如下:
static ArrayList GetAllChildrenWindowHandles(IntPtr hParent, int maxCount)
{
ArrayList result = new ArrayList();
int ct = 0;
IntPtr prevChild = IntPtr.Zero;
IntPtr currChild = IntPtr.Zero;
while (true && ct < maxCount)
{
currChild = FindWindowEx(hParent, prevChild, null, null);
if (currChild == IntPtr.Zero)
{
int errorCode = Marshal.GetLastWin32Error();
break;
}
result.Add(currChild);
prevChild = currChild;
++ct;
}
return result;
}
我得到子窗口的句柄,并使用它的父。但我不能通过findwindowwex把所有的控制都放到子窗口中。对不起,我的英语
您可以使用下面的代码。把它放到某个帮助类中,例如像这样使用它…
var hwndChild = EnumAllWindows(hwndTarget, childClassName).FirstOrDefault();
如果你愿意,你可以"失去"class
检查-但通常你是在检查一个特定的目标。
你可能也想看看这篇文章我做了一会儿-这是使用此方法将焦点设置在远程窗口上(而这些场景是很常见,你迟早会遇到这个障碍)。
调用SetFocus到一个特定的控件
public delegate bool Win32Callback(IntPtr hwnd, IntPtr lParam);
[DllImport("user32.Dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumChildWindows(IntPtr parentHandle, Win32Callback callback, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static public extern IntPtr GetClassName(IntPtr hWnd, System.Text.StringBuilder lpClassName, int nMaxCount);
private static bool EnumWindow(IntPtr handle, IntPtr pointer)
{
GCHandle gch = GCHandle.FromIntPtr(pointer);
List<IntPtr> list = gch.Target as List<IntPtr>;
if (list == null)
throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>");
list.Add(handle);
return true;
}
public static List<IntPtr> GetChildWindows(IntPtr parent)
{
List<IntPtr> result = new List<IntPtr>();
GCHandle listHandle = GCHandle.Alloc(result);
try
{
Win32Callback childProc = new Win32Callback(EnumWindow);
EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
}
finally
{
if (listHandle.IsAllocated)
listHandle.Free();
}
return result;
}
public static string GetWinClass(IntPtr hwnd)
{
if (hwnd == IntPtr.Zero)
return null;
StringBuilder classname = new StringBuilder(100);
IntPtr result = GetClassName(hwnd, classname, classname.Capacity);
if (result != IntPtr.Zero)
return classname.ToString();
return null;
}
public static IEnumerable<IntPtr> EnumAllWindows(IntPtr hwnd, string childClassName)
{
List<IntPtr> children = GetChildWindows(hwnd);
if (children == null)
yield break;
foreach (IntPtr child in children)
{
if (GetWinClass(child) == childClassName)
yield return child;
foreach (var childchild in EnumAllWindows(child, childClassName))
yield return childchild;
}
}
尝试spy++并查看您试图枚举的控件是否为窗口。如果它们不是windows,则不能使用此API枚举它们。
相关文章:
- C++ 获取"控件可能会到达约翰逊-特罗特代码上的非空函数的末尾
- 从资源 ID 获取 CButton 控件名称?
- 如何获取资源文件中对话框的按钮控件的大小和位置
- 使用 GetWindowTextW 从编辑控件获取希伯来语文本
- 使用 LDAP - 本机 API 中的页面控件获取活动目录组中的所有用户 ID
- C++获取对话框控件的位置和大小
- 从丰富的编辑控件获取文本
- 如何从丰富的编辑控件中获取文本作为 CString
- 从另一个窗口上的控件获取文本时出现问题
- 无法从winapi中的编辑控件获取文本
- 如何获取避免滚动条的树视图控件的最小大小
- Win32 c++:如何获取树视图控件中已检查项的数目
- 如何在 MFC 功能包中获取功能区控件以处理ID_WINDOW_TILE_VERT
- 无法获取 Visual C++ 6.0 对话框编辑控件以接受 Unicode /无法获取 EDITTEXT 资源以接受 Unicode
- 有没有办法获取对 MFC 对话框中所有子窗口或控件的引用,因为我有一个引用该控件的 CWnd 对象
- 如何从编辑控件获取数值
- 从编辑控件获取文本(纯Win32 API)
- 如何从Java应用程序(AWT)中的外部控件获取文本(或自动化)
- 从无窗口控件获取文本
- 从另一个进程中的 SysHeader32 控件获取列名