标题:关于枚举所有子窗口问题
取消只看楼主
wypdragon
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:29
专家分:110
注 册:2011-11-19
结帖率:100%
已结贴  问题点数:30 回复次数:2 
关于枚举所有子窗口问题
我程序中的代码如下:
程序代码:
 public delegate bool EnumChildProc(IntPtr hwnd, IntPtr lParam);

[DllImport("user32.dll")]
        private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
        [DllImport("user32.dll", EntryPoint = "EnumChildWindows")]
        public static extern bool EnumChildWindows(IntPtr hwndParent, EnumChildProc EnumFunc, IntPtr lParam);
        bool EnumCP(IntPtr hwnd, IntPtr lParam)
        {
if (GetWindowLong(hwnd, -16) == 56010000)
            {
                  return false;
            }             
return true;
        }


调用时(chwnd是父窗口的句柄):
EnumChildWindows(chwnd, EnumCP, IntPtr.Zero)


问题是子窗口有3个,但只枚举了第一个窗口就停止了,第一个是返回true的,请教大家是什么原因呢?
搜索更多相关主题的帖子: color 
2012-02-01 14:50
wypdragon
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:29
专家分:110
注 册:2011-11-19
得分:0 
谢谢楼上的回答。但我就是用spy++看到的才知道有3个,但只枚举了第一个就停了。GetWindowLong(hwnd, -16)是得到窗口式样,这个值是固定的。逐行跟踪,if (GetWindowLong(hwnd, -16) == 56010000)返回的是false,就是没找到这个式样的窗口,EnumCP返回的是true。把 if (GetWindowLong(hwnd, -16) == 56010000)return false; 这段注释了还是只是枚举第一个就停了,真是郁闷,找来找去找不到问题所在。

[ 本帖最后由 wypdragon 于 2012-2-3 08:28 编辑 ]
2012-02-03 08:24
wypdragon
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:29
专家分:110
注 册:2011-11-19
得分:0 
已经发现问题,原来程序是已经枚举了,要跟踪枚举过程要在 EnumCP 这个过程里面设置断点,没设置的话就一下过了,误以为只枚举一次。没有得到我想要的窗口是因为56010000是16进制的数字,改成if (GetWindowLong(hwnd, -16) == 1442906112)就可以了。

[ 本帖最后由 wypdragon 于 2012-2-4 13:59 编辑 ]
2012-02-04 13:43



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-360235-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.059785 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved