Как узнать, есть ли консоль

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

Ответы

Ответ 1

В конце я сделал следующее:

// 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();

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

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

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

Ответ 2

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

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

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

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

if (GetConsoleWindow() != IntPtr.Zero)
{
    Console.Write("has console");
}

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

например:

В вашем классе библиотеки добавьте конструктор с параметром 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);

Ответ 7

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

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

Console.Read() возвращает -1 в приложении Windows Form без открытия консольного окна. В консольном приложении оно возвращает фактическое значение. Поэтому вы можете написать что-то вроде

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

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

Ответ 8

Я переписал ответ @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(); }

Ответ 9

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