c++ - tutorial - winapi visual studio 2017




¿Cómo comprobar si el programa se ejecuta desde una consola? (3)

El gurú de I18N, Michael Kaplan, de Microsoft, proporcionó una serie de métodos en su blog que le permiten comprobar un montón de cosas en la consola, incluido si la consola ha sido redirigida o no.

Están escritas en C #, pero portar a C o C ++ sería muy sencillo, ya que todo se hace con llamadas a la API de Win32.

Estoy escribiendo una aplicación que descarga algunos diagnósticos a la salida estándar.

Me gustaría que la aplicación funcione de esta manera:

  • Si se ejecuta desde un indicador de comandos independiente (a través de cmd.exe ) o si su salida estándar se ha redirigido / canalizado a un archivo, salga limpiamente tan pronto como termine,
  • De lo contrario (si se ejecuta desde una ventana y la ventana de la consola se genera automáticamente), luego espere que se presione una tecla antes de salir (para que el usuario lea los diagnósticos) antes de que desaparezca la ventana

¿Cómo hago esa distinción? Sospecho que examinar el proceso de los padres podría ser una forma pero no estoy realmente interesado en WinAPI, de ahí la pregunta.

Estoy en MinGW GCC.


La prueba típica es:

if( isatty( STDOUT_FILENO )) {
        /* this is a terminal */
}

Puede utilizar los GetConsoleWindow , GetWindowThreadProcessId y GetCurrentProcessId .

1) Primero debe recuperar el identificador actual de la ventana de la consola utilizando la función GetConsoleWindow .

2) A continuación, obtendrá el propietario del proceso del identificador de la ventana de la consola.

3) Finalmente, compara el PID devuelto con el PID de tu aplicación.

Compruebe esta muestra (VS C ++)

#include "stdafx.h"
#include <iostream>
using namespace std;
#if       _WIN32_WINNT < 0x0500
  #undef  _WIN32_WINNT
  #define _WIN32_WINNT   0x0500
#endif
#include <windows.h>
#include "Wincon.h" 

int _tmain(int argc, _TCHAR* argv[])
{   
    HWND consoleWnd = GetConsoleWindow();
    DWORD dwProcessId;
    GetWindowThreadProcessId(consoleWnd, &dwProcessId);
    if (GetCurrentProcessId()==dwProcessId)
    {
        cout << "I have my own console, press enter to exit" << endl;
        cin.get();
    }
    else
    {
        cout << "This Console is not mine, good bye" << endl;   
    }


    return 0;
}




winapi