Как определить, есть ли консоль? - PullRequest
19 голосов
/ 20 июня 2011

У меня есть некоторый библиотечный код, который используется консольными и wpf-приложениями. В коде библиотеки есть несколько Console.Read() вызовов. Я только хочу сделать эти входные чтения, если приложение является консольным приложением, а не приложением с графическим интерфейсом - как определить в dll, есть ли у приложения консоль?

Ответы [ 10 ]

19 голосов
/ 05 ноября 2014

Работа для меня (используя собственный метод)

Сначала объявите:

    [DllImport("kernel32.dll")]
    static extern IntPtr GetConsoleWindow();

После, проверьте с элегантностью ... хахаха ...:

if (GetConsoleWindow() != IntPtr.Zero)
{
    Console.Write("has console");
}
16 голосов
/ 21 июня 2011

В итоге я сделал следующее:

// Property:
private bool? _console_present;
public bool console_present {
    get {
        if (_console_present == null) {
            _console_present = true;
            try { int window_height = Console.WindowHeight; }
            catch { _console_present = false; }
        }
        return _console_present.Value;
    }
}

//Usage
if (console_present)
    Console.Read();

Следуя совету thekips, я добавил члена-делегата в класс библиотеки для проверки пользователя - и установил для него имплиментацию по умолчанию, которая используется выше, чтобы проверить, есть ли консоль, и если она присутствует, использует ее для получения проверки пользователя или ничего не делает, если нет ( действие продолжается без проверки пользователя). Это значит:

  1. Все существующие клиенты (приложения командной строки, службы Windows (без взаимодействия с пользователем), приложения wpf) работают без изменений.
  2. Любое неконсольное приложение, которому требуется ввод, может просто заменить делегата по умолчанию проверкой другого (GUI - msg box и т. Д.).

Спасибо всем, кто ответил.

13 голосов
/ 14 ноября 2014
if (Environment.UserInteractive)
{
    // A console is opened
}

См .: http://msdn.microsoft.com/en-us/library/system.environment.userinteractive(v=vs.110).aspx

Получает значение, указывающее, выполняется ли текущий процесс в интерактивном режиме пользователя.

8 голосов
/ 20 июня 2011

Вы можете использовать этот код:

public static bool HasMainWindow()
{
    return (Process.GetCurrentProcess().MainWindowHandle != IntPtr.Zero);
}

Хорошо работал с быстрым тестом в приложении Console vs. WinForms.

5 голосов
/ 20 июня 2011

Вы должны исправить это в своем дизайне.Это хороший пример места, в котором инверсия управления была бы очень удобной.Поскольку вызывающий код знает, какой пользовательский интерфейс доступен, этот код должен указывать, например, экземпляр интерфейса IInputReader.Таким образом, вы можете использовать один и тот же код для нескольких сценариев для получения ввода от пользователя.

3 голосов
/ 20 июня 2011

Вы можете передать аргумент при инициализации.

, например:

В своем классе библиотеки добавьте конструктор с параметром IsConsole.

public YourLibrary(bool IsConsole)
{
  if (IsConsole)
  {
     // Do console work
  }
  else 
  {
     // Do wpf work
  }
}

И из консолиВы можете использовать:

YourLibrary lib = new YourLibrary(true);

Форма wpf:

YourLibrary lib = new YourLibrary(false);
1 голос
/ 20 июня 2011

Этот вопрос SO может дать вам какое-то решение ...

Другое решение:

Console.Read () возвращает -1в форме окна приложения, не открывая окно консоли.В консольном приложении возвращает фактическое значение.Таким образом, вы можете написать что-то вроде

        int j = Console.Read();
        if (j == -1)
            MessageBox.Show("Its not a console app");
        else
            Console.WriteLine("It's a console app");

Я тестировал этот код в приложениях консоли и winform.В консольном приложении, если пользователь вводит ' -1 ', значение j равно 45 .Так будет работать.

0 голосов
/ 31 января 2018

Это современный (2018 г.) ответ на старый вопрос.

var isReallyAConsoleWindow = Environment.UserInteractive && Console.Title.Length > 0;

Сочетание Environment.UserInteractive и Console.Title.Length должно дать правильный ответ на вопрос о консольном окне. Это простое и понятное решение.

0 голосов
/ 12 августа 2016

Я переписал ответ @ Ricibob

public bool console_present {
    get {
        try { return Console.WindowHeight > 0; }
        catch { return false; }
    }
}

//Usage
if (console_present) { Console.Read(); }

Это проще, но я предпочитаю эту собственную реализацию:

[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();

//Usage
if (GetConsoleWindow()) { Console.Read(); }
0 голосов
/ 20 июня 2011

если вы хотите хороший дизайн, абстрагируйте зависимости GUI с помощью интерфейса. Реализует конкретный класс для консольной версии, другой для версии WPF, и вводит правильную версию любым способом (внедрение зависимостей, инверсия управления и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...