如何判断是否有控制台

Ric*_*bob 19 c# console

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

Ser*_*ral 19

为我工作(使用本机方法)

首先,声明:

    [DllImport("kernel32.dll")]
    static extern IntPtr GetConsoleWindow();
Run Code Online (Sandbox Code Playgroud)

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

if (GetConsoleWindow() != IntPtr.Zero)
{
    Console.Write("has console");
}
Run Code Online (Sandbox Code Playgroud)


Ric*_*bob 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();
Run Code Online (Sandbox Code Playgroud)

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

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

感谢所有回复的人.


Ped*_*dro 15

if (Environment.UserInteractive)
{
    // A console is opened
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 用于区分Windows服务器和console/wpf应用程序,但实际上并不识别控制台,即区分控制台和wpf. (3认同)

Sha*_*ard 9

您可以使用此代码:

public static bool HasMainWindow()
{
    return (Process.GetCurrentProcess().MainWindowHandle != IntPtr.Zero);
}
Run Code Online (Sandbox Code Playgroud)

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


the*_*kip 5

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

  • 谢谢-我知道这是一个设计缺陷-您的建议是解决此问题的正确方法-但目前这种特殊情况并不能证明正确的重新设计-我只想简单地关闭控制台即可。 (2认同)
  • “调用”代码仍然需要在某种程度上确定这个值。因此回到原来的问题,没有可行的答案。考虑从控制台运行的 Windows 服务与作为正常后台任务运行的 Windows 服务。 (2认同)