我有一些控制台和wpf应用程序使用的库代码。在库代码中,有一些Console.Read()
次调用。我只想做那些输入读取,如果应用程序是一个控制台应用程序,而不是它的GUI应用程序 - 如何在dll中告诉应用程序是否有控制台?
答案 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,使用上面来检查控制台是否存在,如果存在则使用它来获取用户验证,如果不存在则不执行任何操作(没有用户验证就会继续行动)。这意味着:
感谢所有回复的人。
答案 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)