如何阻止EnumWindows运行无限win32

代码一直工作。 不知何故,我设法让Visual C ++ Express在最终的return语句中没有达到中断点,并且似乎永远运行。

在下面的示例代码中,EnumWindows无限枚举。 在枚举完所有窗口之后,如何停止它。

#include <Windows.h> BOOL CALLBACK EnumWindowsProc(HWND hWnd, long lParam) { TCHAR buff[255]; if (IsWindowVisible(hWnd)) { GetWindowText(hWnd, (LPWSTR) buff, 254); printf("%S\n", buff); } return TRUE; } int _tmain(int argc, _TCHAR* argv[]) { EnumWindows(EnumWindowsProc, 0); return 0; } 

您的代码适用于我,一旦我删除了宽字符的东西,并添加#include <stdio.h>以获得printf()声明。 它在你的系统上产生了什么输出?

适用于我的代码是:

 #include <windows.h> #include <stdio.h> BOOL CALLBACK EnumWindowsProc(HWND hWnd, long lParam) { char buff[255]; if (IsWindowVisible(hWnd)) { GetWindowText(hWnd, (LPSTR) buff, 254); printf("%s\n", buff); } return TRUE; } int main() { EnumWindows(EnumWindowsProc, 0); return 0; } 

EnumWindowsProc永远不应该无限运行。

它应该运行,直到:

  • 您的回调返回FALSE
  • 没有更多的顶级窗口来枚举

所以我怀疑它是因为内存损坏或内存访问冲突而无限地运行。

你的printf应该使用%s而不是%S。

 BOOL CALLBACK EnumWindowsProc(HWND hWnd, long lParam) { TCHAR buff[255]; if (IsWindowVisible(hWnd)) { GetWindowText(hWnd, (LPWSTR) buff, 254); printf("%s\n", buff);//<--- %s means use TCHAR* which is WCHAR* in your case } return TRUE; } 

你也不需要像LPWSTR那样施放你的buff。 如果你的buff在某种程度上是一个CHAR缓冲区,那么你需要用Unicode字符集进行编译。

从文档:

EnumWindows继续,直到最后一个顶层窗口枚举或回调函数返回FALSE。

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

嗯,我不明白为什么会这样。 我跑了它,它工作得很好。 它显示了我所有的窗口,然后停下来。 enumWindows将在enumWindowsProc返回false(您将其编码为始终返回true)或者用完顶层窗口来枚举时停止。 -don