How can I get EnumWindows to list all windows?
c++, winapi, windows
Solution
It's (as I assumed) not a problem with `EnumWindows` at all. The problem is with the output stream.
While debugging, I noticed that `enumWindowsProc` is called just fine for every window, but that some iterations are simply not generating output.
For the time being, I switched to using `_tprintf`, but I don't understand what the problem with the original code is. Calling `wcout.flush()` had no desirable effect either.
Problem
I'm assuming, what I'm asking should actually be the default, but I'm experiencing some behavior I don't understand. ``` #include "stdafx.h" using namespace std; BOOL CALLBACK enumWindowsProc( __in HWND hWnd, __in LPARAM lParam ) { if( !::IsIconic( hWnd ) ) { return TRUE; } int length = ::GetWindowTextLength( hWnd ); if( 0 == length ) return TRUE; TCHAR* buffer; buffer = new TCHAR[ length + 1 ]; memset( buffer, 0, ( length + 1 ) * sizeof( TCHAR ) ); GetWindowText( hWnd, buffer, length + 1 ); tstring windowTitle = tstring( buffer ); delete[] buffer; wcout << hWnd << TEXT( ": " ) << windowTitle << std::endl; return TRUE; } int _tmain( int argc, _TCHAR* argv[] ) { wcout << TEXT( "Enumerating Windows..." ) << endl; BOOL enumeratingWindowsSucceeded = ::EnumWindows( enumWindowsProc, NULL ); cin.get(); return 0; } ``` If I invoke that code, it will list all minimized windows: Now, I'm no longer interested in only the minimized windows, now I want all of them. So I remove the `IsIconic` check: ``` BOOL CALLBACK enumWindowsProc( __in HWND hWnd, __in LPARAM lParam ) { /* if( !::IsIconic( hWnd ) ) { return TRUE; } */ int length = ::GetWindowTextLength( hWnd ); if( 0 == length ) return TRUE; TCHAR* buffer; buffer = new TCHAR[ length + 1 ]; memset( buffer, 0, ( length + 1 ) * sizeof( TCHAR ) ); GetWindowText( hWnd, buffer, length + 1 ); tstring windowTitle = tstring( buffer ); delete[] buffer; wcout << hWnd << TEXT( ": " ) << windowTitle << std::endl; return TRUE; } ``` Now I get all windows except the minimized ones (none of the previously listed window handles are listed this time): For completeness, this is the `stdafx.h`: ``` #pragma once #include "targetver.h" #include <iostream> #include <map> #include <string> namespace std { #if defined _UNICODE || defined UNICODE typedef wstring tstring; #else typedef string tstring; #endif } #include <stdio.h> #include <tchar.h> #include <Windows.h> #include <psapi.h> ``` What am I doing wrong?