2011-03-09 79 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

相關問題