2011-03-09 80 views
1

请参阅以下代码。为什么IsWindowVisible使EnumDesktopWindows的回调只运行一次?

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。

+0

我知道你是新来的,但请记住接受你的答案! – 2011-03-09 20:35:13

回答

2

EnumDesktopWindows希望你从MyEnumProc返回值:

return TRUE; 

阅读文档的详细信息。

+0

谢谢!而已! – Chen 2011-03-09 19:48:59

+0

winapi非常糟糕 - 它与IsWindowVisible()无关。如果需要回报,那么应该始终要求。 – Chen 2011-03-09 19:51:10

+0

@Chen Win API很好。你怎么能责怪Win API的失败,从函数返回值?这是一个非常基本的编程错误。仅仅因为你不知道Win API,并没有让它变得糟糕。 – 2011-03-09 20:21:41

3

您必须返回一个值。我希望你的编译器会警告你,你不是。如果它没有警告你,那么你应该改变选项来使它成为可能。

documentation状态:

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

这种终止枚举的功能使您可以将枚举短路。一旦你找到了你想要的物品,就没有必要继续接收回传。有许多Windows API函数遵循这个习惯用法。

+0

编译器没有给我一个警告。 – Chen 2011-03-09 19:52:57

+3

@Chen我强烈建议你配置它。事实上,我会配置它使其成为一个错误,而不是一个警告。 – 2011-03-09 19:54:21

+0

是的,我应该。但我其实不是一个Windows程序员,我只需要今天写一个小窗口程序。我的意思是,我不太喜欢这个Windows建筑环境。但是,谢谢,我会尝试配置编译器更严格。 – Chen 2011-03-09 20:00:16

相关问题