为什么IsWindowVisible使EnumDesktopWindows的回调只运行一次?

时间:2011-03-09 19:41:43

标签: windows winapi

请参阅以下代码。

MyEnumProc仅使用以下代码运行一次。但是如果我注释掉IsWindowVisible(wnd);它会多次运行。

为什么IsWindowVisible会发生这种情况(只运行一次)?我认为IsWindowVisible只是一个检查wnd属性的函数吗?

test.c的代码:

#include <windows.h>
#include <stdio.h>
BOOL CALLBACK MyEnumProc( HWND wnd, LPARAM lParam )
{
    printf("run\n");
    IsWindowVisible(wnd);
}

int main( void )
{
    EnumDesktopWindows( NULL, MyEnumProc, 0 );
    printf("end\n");
    return 0;
}

我的环境是:

Windows XP SP3。

gcc 3.4.6(mingw)

编译选项是:gcc -o test.exe test.c

我编译并在cmd.exe中运行test.exe。

2 个答案:

答案 0 :(得分:3)

您必须返回一个值。我希望你的编译器警告你,你不是。如果它没有警告你,那么你应该改变选项以使它这样做。

documentation州:

  

继续枚举,回调   函数必须返回TRUE;停止   枚举,它必须返回FALSE。

此终止枚举的功能允许您使枚举短路。找到所需的项目后,无需继续接收回调。有许多Windows API函数遵循这个习惯用法。

答案 1 :(得分:2)

EnumDesktopWindows希望您从MyEnumProc返回一个值:

return TRUE;

阅读文档以获取更多信息。