¿Como puedo detectar si mi programa fue ejecutado desde terminal?

Iniciado por 4dr14n31t0r, 19 Febrero 2017, 19:42 PM

0 Miembros y 1 Visitante están viendo este tema.


Eleкtro

#1
Cita de: 4dr14n31t0r en 19 Febrero 2017, 19:42 PMO 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 :xD), 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:

Código (vbnet) [Seleccionar]
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!