Comment vérifier si le programme est exécuté à partir d'une console?

J'écris une application qui vide certains diagnostics sur la sortie standard.

J'aimerais avoir l'application fonctionne de cette façon:

  • si elle est exécutée à partir d'une invite de commande autonome (via cmd.exe) ou si la sortie standard est redirigée / redirigée vers un fichier, quittez proprement dès qu'elle est terminée,
  • Sinon (si elle est exécutée à partir d'une fenêtre et que la fenêtre de la console est générée automatiquement), alors en outre, attendez une pression sur la touche avant de quitter (pour laisser l'Utilisateur lire le diagnostics) avant la disparition de la fenêtre

Comment faire cette distinction? je soupçonne que l'examen du processus parent pourrait être un moyen, mais je ne suis pas vraiment dans WinAPI, d'où la question.

Je suis sur MinGW GCC.

21
demandé sur Borealid 2012-01-25 23:54:20

4 réponses

Vous pouvez utiliser GetConsoleWindow, GetWindowThreadProcessId et GetCurrentProcessId méthodes.

1) vous devez d'abord récupérer le handle actuel de la fenêtre de la console à l'aide de la fonction GetConsoleWindow.

2) Ensuite, vous obtenez le propriétaire du processus du handle de la fenêtre de la console.

3) Enfin, vous comparez le PID retourné au PID de votre application.

Vérifiez cet exemple (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;
}
20
répondu RRUZ 2014-10-13 02:19:01

J'en avais besoin en C#. Voici la traduction:

[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;
}
4
répondu SMD 2012-09-10 16:51:42

Le test typique est:

if( isatty( STDOUT_FILENO )) {
        /* this is a terminal */
}
3
répondu William Pursell 2012-01-25 19:58:24

Le gourou i18n Michael Kaplan de Microsoft a fourni une série de méthodes sur son blog {[2] } qui vous permettent de vérifier un tas de choses sur la console, y compris si la console a été redirigée ou non.

Ils sont écrits en C#, mais le portage en C ou c++ serait très simple, car tout est fait avec des appels à L'API Win32.

2
répondu Michael Madsen 2014-10-08 17:10:28