如何获取窗口内文本框的句柄

版权声明:转载请注明出处 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方法:遍历所有控件句柄。

 

猜你喜欢

转载自blog.csdn.net/weixin_42183571/article/details/82461455