1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| typedef std::basic_string<TCHAR> stringT;
bool GetConsoleTextFromOutputHandle( HANDLE hConsoleOut, stringT & Result )
{
// déterminer la taille du buffer pour stocker le texte
CONSOLE_SCREEN_BUFFER_INFO screen_info;
if ( !GetConsoleScreenBufferInfo(
hConsoleOut,
&screen_info ) )
{
return false;
}
// allouer un buffer de 64 Ko
const DWORD buffer_size = 64 * 1024 / sizeof( TCHAR );
TCHAR buffer[ buffer_size ];
// déterminer le nombre de caractères à lire
DWORD nb_wanted = screen_info.dwSize.X * screen_info.dwSize.Y;
if ( nb_wanted > buffer_size ) // ne devrait jamais se produire...
{
nb_wanted = buffer_size;
}
// récupérer le texte
COORD read_coord = { 0, 0 };
DWORD nb_read;
if ( !ReadConsoleOutputCharacter(
hConsoleOut,
buffer,
nb_wanted,
read_coord,
&nb_read ) )
{
return false;
}
// déterminer la fin réelle du texte en recherchant le dernier
// caractère qui ne soit pas un espace
LPTSTR buffer_end = &buffer[ nb_read - 1 ];
while ( buffer_end[ -1 ] == TEXT( ' ' ) &&
buffer_end > buffer )
{
--buffer_end;
}
size_t text_length = buffer_end - buffer;
// déterminer le nombre de lignes que cela fait
size_t line_width = screen_info.dwSize.X;
size_t nb_lines = ( text_length + line_width - 1 ) / line_width;
// prendre en compte les '\n' insérés pour l'allocation
Result.clear();
Result.reserve( ( line_width + 1 ) * nb_lines );
// parcourir chacune de ces lignes
for ( size_t i = 0; i < nb_lines; ++i )
{
TCHAR * begin = buffer + i * line_width;
TCHAR * end = begin + line_width;
// trouver la fin réelle de la ligne
while ( end[ -1 ] == TEXT( ' ' ) &&
end > begin )
{
--end;
}
// ajouter cette ligne au résultat
Result.append( begin, end );
// ajouter un saut de ligne si ce n'est pas la dernière
if ( i != nb_lines - 1 )
{
Result += TEXT( '\n' );
}
}
return true;
}
bool GetConsoleTextFromTitle( LPCTSTR ConsoleTitle, stringT & Result )
{
static LPCTSTR ConsoleClassName = TEXT( "ConsoleWindowClass" );
// trouver la fenêtre console à partir du titre donné
HWND hConsoleWnd = ::FindWindow(
ConsoleClassName,
ConsoleTitle );
if ( hConsoleWnd == NULL )
{
return false;
}
// récupérer le processus associé à cette fenêtre
DWORD pid;
if ( !::GetWindowThreadProcessId( hConsoleWnd, &pid ) )
{
return false;
}
// s'attacher à la console de ce processus
if ( !::AttachConsole( pid ) )
{
return false;
}
// récupérer un handle sur la sortie console
HANDLE hOutput = ::GetStdHandle( STD_OUTPUT_HANDLE );
if ( hOutput == INVALID_HANDLE_VALUE )
{
::FreeConsole();
return false;
}
// récupérer le texte de cette sortie
bool res = GetConsoleTextFromOutputHandle( hOutput, Result );
// se détacher de la console
::FreeConsole();
// fin
return res;
} |
Partager