Csharp/C#教程:如何判断是否有控制台分享


如何判断是否有控制台

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

最后我做了如下:

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

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

感谢所有回复的人。

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

首先,声明:

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

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

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

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

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

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

您可以使用此代码:

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

通过Console vs. WinForms应用程序快速测试工作得很好。

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

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

例如:

在库类中,使用“IsConsole”参数添加构造函数。

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

从Console可以使用:

 YourLibrary lib = new YourLibrary(true); 

表格wpf:

 YourLibrary lib = new YourLibrary(false); 

这个问题可能会为你提供一些解决方案……

另一种解决方案是

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 。 所以它会奏效。

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

我改写了@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(); } 

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

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

上述就是C#学习教程:如何判断是否有控制台分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1004132.html

(0)
上一篇 2021年12月28日
下一篇 2021年12月28日

精彩推荐