如何判断是否有控制台

时间:2011-06-20 08:31:04

标签: c# console

我有一些控制台和wpf应用程序使用的库代码。在库代码中,有一些Console.Read()次调用。我只想做那些输入读取,如果应用程序是一个控制台应用程序,而不是它的GUI应用程序 - 如何在dll中告诉应用程序是否有控制台?

11 个答案:

答案 0 :(得分:19)

为我工作(使用原生方法)

首先,声明:

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

之后,检查优雅......哈哈哈......:

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

答案 1 :(得分:16)

最后我做了如下:

// 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的建议,我向库类中添加了一个委托成员来获取用户验证 - 并将其设置为默认的implimentation,使用上面来检查控制台是否存在,如果存在则使用它来获取用户验证,如果不存在则不执行任何操作(没有用户验证就会继续行动)。这意味着:

  1. 所有现有客户端(命令行应用程序,Windows服务(无用户交互),wpf应用程序)都无需更改。
  2. 任何需要输入的非控制台应用程序都可以用另一个(GUI - msg框等)验证来替换默认委托。
  3. 感谢所有回复的人。

答案 2 :(得分:13)

if (Environment.UserInteractive)
{
    // A console is opened
}

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

获取一个值,该值指示当前进程是否以用户交互模式运行。

答案 3 :(得分:8)

您可以使用此代码:

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

在Console vs. WinForms应用程序上进行快速测试时工作得很好。

答案 4 :(得分:5)

你应该在你的设计中解决这个问题。这是一个控制反转非常方便的地方的一个很好的例子。由于调用代码知道哪个UI可用,因此该代码应指定IInputReader接口的实例。这样,您可以在多个场景中使用相同的代码来获取用户的输入。

答案 5 :(得分:3)

你可以在初始化时传递参数。

例如:

在库类中,添加带有'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);

答案 6 :(得分:1)

This SO question可能会为您提供一些解决方案......

另一种解决方案是:

Console.Read()在Windows窗体应用程序中返回-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 。所以它会起作用。

答案 7 :(得分:0)

如果你想要一个好的设计,使用一个接口抽象GUI依赖。 为控制台版本实现一个具体类,为WPF版本实现另一个类,并使用任何方式注入正确的版本(依赖注入,控制反转等)。

答案 8 :(得分:0)

我改写了@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 :(得分:0)

这是对旧问题的现代(2018)答案。

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

Environment.UserInteractive和Console.Title.Length的组合应该给出控制台窗口问题的正确答案。 这是一个简单而直接的解决方案。

答案 10 :(得分:0)

已经有很多(不满意的)答案了...这里有一个非常简单优雅的答案:

if (Console.LargestWindowWidth != 0) { /* we have a console */ }

LargestWindowWidth 在没有控制台窗口时不会抛出并返回 0。

(否则,我认为可以安全地假设它永远不会返回 0)