我有一些库控制台和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建议我增加了一个代表成员库类来获得用户的验证 - 这设置为上述使用的默认执行力度,检查那里有一个控制台,如果存在则使用它来获取用户验证,或者如果不存在则不做任何操作这意味着:
- 所有现有客户端(命令行应用程序,Windows服务(无用户交互),wpf应用程序)都可以使用更改。
- 任何需要输入的非控制台应用程序都可以用其他方法(GUI - msg box等)验证来代替默认的代理。
感谢所有回复的人。
使用try catch来做到这一点并不是很好的做法 –
如果你想要一个好的设计,使用一个接口抽象GUI依赖。 为控制台版本实现一个具体类,为WPF版本实现另一个类,并以任何方式(依赖注入,控制反转等)注入正确的版本。
您可以在初始化时传递参数。
例如:
在你的库类,添加具有 '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);
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的值为。所以它会起作用。
谢谢 - 但我需要知道在应用程序启动时,我不想要求在此时从控制台输入(并在控制台应用程序Console.Read将这样做)。此外在wpf Console.Read导致挂起(或异常取决于它的调用时间)。 – Ricibob
您可以使用此代码:
public static bool HasMainWindow()
{
return (Process.GetCurrentProcess().MainWindowHandle != IntPtr.Zero);
}
工作正常与控制台与WinForms应用程序的快速测试。
为我工作(使用本机方法)
首先声明:
[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
获取一个值,该值指示当前进程是否以用户交互模式运行。
适用于区分windows server和console/wpf app,但实际上并不能识别控制台,即区分console和wpf。 – Ricibob
正确的是,服务可以在WIndows系统上以交互模式运行,这已经是很长一段时间了。对于简单的桌面应用程序,此方法可能是可接受的如果您编写的代码可能在Windows进程以及桌面环境(例如日志代码)中运行,那么此方法可能会产生意想不到的后果(如作为服务运行时编写控制台输出的浪费周期)。 –
我改写了@ 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的组合应该给出一个适当的答案来解决一个控制台窗口的问题。 这是一个简单而直接的解决方案。
- 1. 如何判断您的控制器操作是否有参数?
- 2. 如何判断加载是否有效?
- 3. 如何判断控制器何时从后台恢复?
- 4. 如何判断视图或控制器中是否有物体? (Zend Framework)
- 5. 如何判断“ZipArchiveEntry”是否是目录?
- 6. WatchOS 3 - 如何判断父应用是否在前台?
- 7. 如何判断一台计算机是否加入域?
- 8. 如何判断NSUserDefaults是否已保存?
- 9. 如何判断插座是否连接?
- 10. 如何判断MIDIEndpointRef是否为虚拟?
- 11. 如何判断AirPlay是否为镜像?
- 12. 如何判断HttpResponse是否已关闭?
- 13. 如何判断editText是否在焦点?
- 14. 如何判断UIPrintInteractionController是否显示?
- 15. 如何判断孩子是否为零
- 16. 如何判断Safari是否使用HTTP2?
- 17. 如何判断对象是否为空?
- 18. 如何判断cudaFree()是否安全?
- 19. 如何判断tcplistener是否已关闭?
- 20. 如何判断网页是否存在?
- 21. 如何判断是否安装了node.js
- 22. 如何判断变量是否为空?
- 23. Selenium/Phantomjs:如何判断是否导航?
- 24. 如何判断W键是否按下
- 25. 如何判断AUCTeX是否可用?
- 26. INSERT IGNORE - 如何判断是否插入?
- 27. 如何判断Streamwriter是否已关闭?
- 28. 如何判断是否从JUnit调用?
- 29. 如何判断是否使用EF5
- 30. 如何判断UITextView是否脏?
[C#Windows控制台应用程序如何判断它是否以交互方式运行](http://stackoverflow.com/a/8711036/344541) –
我的评论是一个链接 - 对于混淆抱歉。 –
[C#Windows控制台应用程序如何判断它是否以交互方式运行]的可能重复(http://stackoverflow.com/questions/1188658/how-can-ac-sharp-windows-console-application-tell-if-它是交互式地运行) –