you what develop applications application winapi console

winapi - what - ¿Puede una aplicación de consola Win32 detectar si se ha ejecutado desde el explorador o no?



what types of windows desktop applications can you develop using c++? (5)

¿Qué tal esperar una pulsación de tecla cuando muestra el mensaje de error, y no otras veces?

Tengo que crear una aplicación de consola que necesita ciertos parámetros. Si faltan o están equivocados, imprimo un mensaje de error.

Ahora el problema: si alguien inicia el programa desde el explorador haciendo doble clic en la ventana de la consola, desaparece inmediatamente. (Pero la aplicación no es del todo inútil desde el explorador, podría arrastrar archivos sobre ella y funcionaría)

Siempre podía esperar una pulsación de tecla, pero no quiero eso si el usuario lo inició desde la línea de comando.

¿Hay alguna forma de distinguir entre estas situaciones?


Consulte http://support.microsoft.com/kb/99115 , "INFORMACIÓN: evitar que la ventana de consola desaparece".

La idea es usar GetConsoleScreenBufferInfo para determinar que el cursor no se haya movido desde la posición inicial de 0,0.

Ejemplo de código de @tomlogic, basado en el artículo de Knowledge Base referenciado:

// call in main() before printing to stdout // returns TRUE if program is in its own console (cursor at 0,0) or // FALSE if it was launched from an existing console. // See http://support.microsoft.com/kb/99115 #include <stdio.h> #include <windows.h> int separate_console( void) { CONSOLE_SCREEN_BUFFER_INFO csbi; if (!GetConsoleScreenBufferInfo( GetStdHandle( STD_OUTPUT_HANDLE), &csbi)) { printf( "GetConsoleScreenBufferInfo failed: %lu/n", GetLastError()); return FALSE; } // if cursor position is (0,0) then we were launched in a separate console return ((!csbi.dwCursorPosition.X) && (!csbi.dwCursorPosition.Y)); }


Creo que cmd.exe establece las variables de entorno CMDCMDLINE y CMDEXTVERSION cuando se inicia. Entonces, si se configuran, su programa probablemente se inició desde un shell.

Esto no es infalible, pero es algo.

También es posible determinar el PID de tus padres en algunas formas intrincadas y posiblemente poco confiables, o eso creo. Es posible que desee investigar eso.


Esto funciona como un encanto:

@echo off for %%x in (%cmdcmdline%) do if /i "%%~x"=="/c" goto nonconsole :console <do something> goto exit :nonconsole <do something> pause :exit

Copiado de este hilo . También probé a evaluar% cmdcmdline%, pero hay un problema con respecto a los caracteres de comillas ("), lo que impide que algo como "% cmdcmdline% "=="% ComSpec% "goto [target] funcione.


GetConsoleTitle()

He visto código que funciona

if (!GetConsoleTitle(NULL, 0) && GetLastError() == ERROR_SUCCESS) { // Console } else { // GUI }

PERO ... He descubierto que AttachConsole() es más útil

En C ++ (fuera de mi cabeza, y no soy programador de C ++)

if (!AttachConsole(ATTACH_PARENT_PROCESS)) { // GUI } else { // Console, and you have a handle to the console that already exists. }

Es mas efectivo Además, si se encuentra en un entorno de GUI y desea permanecer allí el mayor tiempo posible, pero luego descubre que ha ocurrido algo catastrófico que realmente podría usar un volcado a la ventana de la consola (no se puede escribir escribiendo un cuadro de edición ventana para AllocConsole() o adjuntarlo al registro del Sistema NT y arrojar un MessageBox() ) bien entonces puede AllocConsole() más adelante en el proceso, cuando los métodos de GUI han fallado.