| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2308 人关注过本帖
标题:关于枚举所有子窗口问题
只看楼主 加入收藏
wypdragon
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:29
专家分:110
注 册:2011-11-19
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:6 
关于枚举所有子窗口问题
我程序中的代码如下:
程序代码:
 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
niuniu502
Rank: 2
等 级:论坛游民
帖 子:6
专家分:50
注 册:2012-2-1
收藏
得分:10 
可以用SPY++看看到底有几个子窗体,不一定是3个
2012-02-01 20:50
xydddaxia
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:33
帖 子:466
专家分:2307
注 册:2009-3-20
收藏
得分:20 
if (GetWindowLong(hwnd, -16) == 56010000)
这句改成if (GetWindowLong(hwnd, -16) >0)
因为每次启动程序全部句柄id都 变完了,没有固定值
GetWindowLong返回大于0就表示找到密码框了
返回0表示失败

站在春哥的肩膀上
2012-02-02 09:11
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
xydddaxia
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:33
帖 子:466
专家分:2307
注 册:2009-3-20
收藏
得分:0 
看看每个GetWindowLong(hwnd, -16)返回的值是多少?

站在春哥的肩膀上
2012-02-03 09:29
xydddaxia
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:33
帖 子:466
专家分:2307
注 册:2009-3-20
收藏
得分:0 
这样改一下代码也许能成
程序代码:
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);

        int formCount=0;//找到的指定样式的窗体数量

        bool EnumCP(IntPtr hwnd, IntPtr lParam)
        {
            if (GetWindowLong(hwnd, -16) == 56010000)
            {
                  formCount++;
            }            
            return true;
        }




 

站在春哥的肩膀上
2012-02-03 09:34
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
快速回复:关于枚举所有子窗口问题
数据加载中...
 
   



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

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