Как проверить, запускается ли программа из консоли? - PullRequest
23 голосов
/ 25 января 2012

Я пишу приложение, которое выводит некоторую диагностику на стандартный вывод.

Я бы хотел, чтобы приложение работало так:

  • Если он запускается из отдельной командной строки (через cmd.exe) или имеет стандартный вывод, перенаправленный / переданный по каналу в файл, завершите работу сразу же после его завершения,
  • В противном случае (если оно запускается из окна, а окно консоли создается автоматически), тогда дополнительно дождитесь нажатия клавиши перед выходом (чтобы пользователь мог прочитать диагностику), прежде чем окно исчезнет

Как мне сделать это различие? Я подозреваю, что проверка родительского процесса может быть способом, но я не очень в WinAPI, поэтому вопрос.

Я нахожусь на MinGW GCC.

Ответы [ 4 ]

22 голосов
/ 26 января 2012

Вы можете использовать методы GetConsoleWindow , GetWindowThreadProcessId и GetCurrentProcessId .

1) Сначала вы должны получить текущий дескриптор окна консоли, используя функцию GetConsoleWindow.

2) Затем вы получите владельца процесса дескриптора окна консоли.

3) Наконец, вы сравниваете возвращенный PID с PID вашего приложения.

Проверьте этот образец (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;
}
5 голосов
/ 10 сентября 2012

Мне нужно это в C #.Вот перевод:

[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;
}
3 голосов
/ 26 января 2012

Гуру I18N Майкл Каплан из Microsoft предоставил серию методов в своем блоге , которые позволят вам проверить кучу вещей на консоли, в том числе на предмет перенаправления консоли.

Они написаны на C #, но перенос на C или C ++ будет очень простым, поскольку все это делается с помощью вызовов Win32 API.

3 голосов
/ 25 января 2012

Типичный тест:

if( isatty( STDOUT_FILENO )) {
        /* this is a terminal */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...