版权声明:转载请注明出处 https://blog.csdn.net/weixin_42183571/article/details/82461455
一 背景
某种情况下,需要从某窗体获取该窗体文本框内的内容,发现文本框并没有标题名,无法获取文本框控件的句柄。接下来,我将介绍我获取所需文本框控件句柄方法。
二 使用Spy++获取
如图,打开Spy++可以直接获取到“测试窗口”的所有控件句柄。
三 EnumChildWindows遍历所有句柄
一般窗体内文本框前面都有一个lable控件来标注,比如“测试窗口”内有一个名为“Test”的标示。在使用EnumChildWindows遍历时,发现lable控件句柄后的那个句柄一般都是对应文本框的。所以,我们可以使用FindWindowEx(h, IntPtr.Zero, null, lpszWindow)函数获取lable控件的句柄。然后遍历出所有句柄,查找到label控件的句柄后,往后+1即可找到文本框的句柄。
public static List<IntPtr> GetIntPtr(IntPtr hwd)
{
List<IntPtr> listIntPtr = new List<IntPtr>();
ExternApi.EnumChildWindows(hwd, delegate (IntPtr hWnd, int lParam)
{
listIntPtr.Add(hWnd);
return true;
}, 0);
return listIntPtr;
}
public static IntPtr FindWindowEx(IntPtr hwnd, string lpszWindow, bool bChild)
{
IntPtr iResult = IntPtr.Zero;
// 首先在父窗体上查找控件
iResult = ExternApi.FindWindowEx(hwnd, IntPtr.Zero, null, lpszWindow);
// 如果找到直接返回控件句柄
if (iResult != IntPtr.Zero) return iResult;
// 如果设定了不在子窗体中查找
if (!bChild) return iResult;
// 枚举子窗体,查找控件句柄
int i = ExternApi.EnumChildWindows(
hwnd,
(h, l) =>
{
IntPtr f1 = ExternApi.FindWindowEx(h, IntPtr.Zero, null, lpszWindow);
if (f1 == IntPtr.Zero)
return true;
else
{
iResult = f1;
return false;
}
},
0);
// 返回查找结果
return iResult;
}
代码段共包含两个方法,FindWindowEx方法:获得lable控件句柄;GetIntPtr方法:遍历所有控件句柄。