代码一直工作。 不知何故,我设法让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
永远不应该无限运行。
它应该运行,直到:
所以我怀疑它是因为内存损坏或内存访问冲突而无限地运行。
你的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