visual tutorial studio que gui con clase c++ c winapi

c++ - tutorial - ¿Cómo comprobar si el programa se ejecuta desde una consola?



winapi que es (4)

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 */ }


Necesitaba esto en C #. Aquí está la traducción:

[DllImport("kernel32.dll")] static extern IntPtr GetConsoleWindow(); [DllImport("kernel32.dll")] static extern IntPtr GetCurrentProcessId(); [DllImport("user32.dll")] static extern int GetWindowThreadProcessId(IntPtr hWnd, ref IntPtr ProcessId); static int Main(string[] args) { IntPtr hConsole = GetConsoleWindow(); IntPtr hProcessId = IntPtr.Zero; GetWindowThreadProcessId(hConsole, ref hProcessId); if (GetCurrentProcessId().Equals(hProcessId)) { Console.WriteLine("I have my own console, press any key to exit"); Console.ReadKey(); } else Console.WriteLine("This console is not mine, good bye"); return 0; }


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; }