Как узнать, есть ли консоль
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");
}
Ответ 3
if (Environment.UserInteractive)
{
// A console is opened
}
Смотрите: http://msdn.microsoft.com/en-us/library/system.environment.userinteractive(v=vs.110).aspx
Возвращает значение, указывающее, запущен ли текущий процесс в интерактивном режиме пользователя.
Ответ 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 и вводит правильную версию любым способом (инъекция зависимостей, инверсия элемента управления и т.д.).