枚举子窗口不起作用,但enumWindows确实......?

时间:2014-06-01 17:54:23

标签: c++ windows

标题

我不知道为什么,但是当我开始枚举窗口时,它会正确显示,但是枚举子窗口不会进入函数...并且移动代码... 如果我把hwnd = 0它运行...不知道为什么不用hwnd找到子窗口。

enter code here
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
HWND h;
int WPoc, CHPoc;
static BOOL CALLBACK EnumWindowsProc(HWND hProg, long lParam)
{
    WPoc++; 
    cout << WPoc << ": " << hProg << endl;
    if(WPoc == 5) h = hProg;
    if (WPoc > 20) return FALSE;
    return TRUE;
}
static BOOL CALLBACK EnumChildProc(HWND hProg, long lParam)
{
    CHPoc++;
    cout <<"ch "<< CHPoc << endl;
    if (CHPoc > 20) return FALSE;
    return TRUE;
}
void Search()
{
    WPoc = 0;
    BOOL ProcSuccess;
    ProcSuccess = EnumWindows((WNDENUMPROC)EnumWindowsProc,NULL);
}
void SearchMap()
{
    CHPoc = 0;
    BOOL ProcSuccess;
    ProcSuccess = EnumChildWindows( h,(WNDENUMPROC)EnumChildProc,NULL);
}

int _tmain(int argc, _TCHAR* argv[])
{
    Search();
    SearchMap();

    return 0;
}

我制作了这个简单的代码来发现错误,它也是这样做的...... 我不知道出了什么问题...谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

它不适合你,因为你找到了没有孩子的窗户。调试你的东西。在Serach()后粘贴breackpoint,查看h的值。打开Spy ++并找到与h具有相同值的句柄。看看这个窗口是否有儿童。 可能的输出:

1: 0004069E
2: 000305C4
3: 00030526
4: 00010158
5: 000100BA
6: 000100BC
7: 000100A6
8: 000100AA
9: 000100AC
10: 0001008E
11: 000100A2
12: 000100A4
13: 00010086
14: 00050598
15: 0006052E
16: 0010042E
17: 0011041A
18: 000D040C
19: 000803B8
20: 000903BC
21: 000903C8
ch 1
ch 2
ch 3
ch 4

答案 1 :(得分:0)

您发布的程序的输出不是由源代码确定的。

它取决于EnumWindows枚举的第5个窗口的实际窗口,这取决于系统。如果该窗口没有子节点,则传递给EnumChildWindows的回调将永远不会被调用 - 显然,在您的情况下,这就是正在发生的事情。