O mejor dicho, ¿Es posible?
Suponiendo que estemos refiriéndonos a un executable de Windows con interfáz gráfica, entonces cada vez que inicias dicho executable desde el proceso CMD, la instancia de consola de la CMD se adjunta al proceso iniciado desde esa CMD (
EDITO: por supuesto no es que la ventana de la CMD se adhiera a la GUI, eso no ocurre
), y esto nos permite comprobar facilmente si nuestra aplicación fue iniciada o no desde la consola. ¿Cómo?, pues intentando adjuntarle una consola a nuestro proceso haciendo uso de la función Win32
AttachConsole y comprobando el valor de retorno de dicha función. Recuerda liberar la consola adjuntada para la evaluación, con la función
FreeConsole.
Esta es la forma en que se puede detectar si una aplicación de .NET fue iniciada desde la consola o no. Y para ser honestos desconozco si este procedimiento automático de adjunción de consola actua de la misma manera para todos los executables con interfáz gráfica o solamente para los ensamblados .NET con interfáz gráfica. Será cuestión de que lo compruebes por ti mismo.
Te dejo aquí un código de ejemplo para .NET:
Imports System.Security
Public NotInheritable Class NativeMethods
<SuppressUnmanagedCodeSecurity>
<DllImport("Kernel32.dll", SetLastError:=True)>
Public Shared Function AttachConsole(ByVal pid As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
<SuppressUnmanagedCodeSecurity>
<DllImport("Kernel32.dll", SetLastError:=True)>
Public Shared Function FreeConsole() As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
End Class
Public NotInheritable Class AppUtil
Public Shared ReadOnly Property IsAppExecutedFromConsole() As Boolean
<DebuggerStepThrough>
Get
Dim result As Boolean = NativeMethods.AttachConsole(-1)
If (result) Then
NativeMethods.FreeConsole()
End If
Return result
End Get
End Property
End Class
Public NotInheritable Class Form1 : Inherits Form
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
MsgBox(AppUtil.IsAppExecutedFromConsole)
End Sub
End Class
¡Saludos!