有没有办法写入控制台/命令提示符/ powershell(如Console.WriteLine())或UWP应用程序中的类似内容?
如果控制台不可用,那么我可以使用一个合适的替代方法来向屏幕写入大量文本吗?
当然,我可以对它进行XAML控制并输出,但与简单相比,它似乎并不方便Console.WriteLine().
关于WPF控制台也有很老的讨论,但似乎没有任何工作(至少,我找不到Project-Properties-Application tab-Output Type-Console Application并且Trace.WriteLine("text")不可用).
背景:我正在努力为现有的WPF Windows应用程序添加命令行和批处理功能.当我在启动时检测到一些选项时,我禁止窗口出现,进行一些处理并立即退出.现在,因为没有UI,我想将一些消息输出到stdout/stderr.考虑以下代码:
namespace WpfConsoleTest
{
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
Console.WriteLine("Start");
System.Threading.Thread.Sleep(1000);
Console.WriteLine("Stop");
Shutdown(0);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我从命令行运行时,我希望以下输出:
Start
Stop
Run Code Online (Sandbox Code Playgroud)
但反而:
C:\test>WpfConsoleTest.exe
C:\test>
Run Code Online (Sandbox Code Playgroud)
但是,您可以重定向输出:
C:\test>WpfConsoleTest.exe > out.txt
C:\test>type out.txt
Start
Stop
Run Code Online (Sandbox Code Playgroud)
不幸的是,重定向到CON不起作用:
C:\test>WpfConsoleTest.exe > CON
C:\test>
Run Code Online (Sandbox Code Playgroud)
另一个问题是WpfConsoleTest.exe在启动后立即退出.所以:
C:\test>WpfConsoleTest.exe > out.txt & type out.txt
C:\test>
Run Code Online (Sandbox Code Playgroud)
但:
C:\test>WpfConsoleTest.exe > out.txt & ping localhost > nul & type out.txt
Start
Stop
Run Code Online (Sandbox Code Playgroud)
到目前为止,我能够提供的最佳解决方案是使用start /B /wait:
C:\test>start /B /wait WpfConsoleTest.exe …Run Code Online (Sandbox Code Playgroud) 我有一个WinForms项目,如果用户想要一个调试控制台,我会分配一个控制台AllocConsole().
所有控制台输出都正常工作,目标架构设置为"任何CPU",但当我将其更改为"x86"时,它不输出任何内容(Console.Read()仍然按预期工作).如果我直接打开EXE,则输出有效.看起来Visual Studio将其重定向到它自己的"输出"窗口.
我也试过这个答案,但它没有用,我也尝试过Console.SetOut(GetStdHandle(-11)),但也没用.
将目标体系结构设置为"任何CPU"对我来说是没有选择的.
所以这是我的两个问题:
我编写的应用程序可以在命令行上运行,也可以使用WPF UI运行.
[STAThread]
static void Main(string[] args)
{
// Does magic parse args and sets IsCommandLine to true if flag is present
ParseArgs(args);
if(IsCommandLine)
{
// Write a bunch of things to the console
}
else
{
var app = new App();
app.Run(new Window());
}
}
Run Code Online (Sandbox Code Playgroud)
我将项目的输出类型设置为控制台应用程序,如果我尝试通过双击exe来执行它,我会弹出一个控制台窗口.如果未设置标志(通过命令args传入),我不想向用户显示控制台窗口.
但是,如果我将项目的输出类型设置为Windows应用程序,则双击行为很好,但是当我在控制台中运行它时,我没有控制台输出(Console.Writeline)
嗨,我知道如何写入控制台,但如果我在程序中写入控制台并从命令行调用我的程序,它将不会显示任何内容.
当我说Console.WriteLine或Console.Out.Writeline ir打印到调用它的命令提示符而不是其他地方时,我该怎么做呢?
我再一次知道怎么做Console.WriteLine所以它不是那样的:-p除非我做错了.
从我可以告诉它可能与Console.SetOut(TextWriter t)有关
这是一个WPF应用程序,我需要它将其数据发布到命令行,同时仍然在启动时保留GUI.我已经三次检查并且我的代码点击了打印行,我实际上可以看到正在打印到Visual Studio输出窗口的行,当我在没有VS的情况下手动运行它时,它不会显示在命令行中.
如果可能,我需要有条件地拥有控制台显示器.即,如果从命令行(或甚至使用命令参数)运行,则显示或发布到提示符,否则不显示.
是否可以在WPF窗口中嵌入控制台窗口?
作为一个小背景,起初,我试图在WPF中从头开始实现一个控制台窗口,除了一个巨大的问题之外它是成功的 - 它非常慢.请参阅此处的问题:
Windows WPF或Silverlight中的VT100终端仿真
由于这似乎不是一个选项,我反而考虑在我的WPF应用程序中托管一个实际的控制台窗口,我已经学会了如下所述:
这很好,但理想情况下,我希望控制台窗口看起来像是WPF应用程序其余部分的一部分.我知道有可能使用WinForms应用程序,因为我已经看到它完成,涉及使用SetParent Win32 API.您可以看到一个示例.NET项目,该项目使用此CommandBar项目将控制台窗口嵌入到shell中:
http://www.codeproject.com/KB/cs/commandbar.aspx
所以我希望它也可以用WPF完成,但我不知道你是怎么做到的.非常感谢帮助(同样,如果您对我在WPF中从头开始创建终端窗口的原始问题有任何出色的解决方案,因为这也将解决我的需求).
更新:
在Reed Copsey的帮助下,我能够嵌入控制台窗口.但是,当然它需要进行样式化和移动,否则它看起来就像WPF窗口中的常规控制台窗口.我需要标题栏和大边框删除.做研究我想出了如何使用Win32 API这样做:
uint style = GetWindowLong(ConsoleManager.ConsoleWindowHandle, GWL_STYLE);
style &= ~(uint)WindowStyles.WS_CAPTION;
style &= ~(uint)WindowStyles.WS_THICKFRAME;
style &= ~(uint)WindowStyles.WS_DLGFRAME;
style &= ~(uint)WindowStyles.WS_POPUP;
SetWindowLong(ConsoleManager.ConsoleWindowHandle, GWL_STYLE, style);
MoveWindow(ConsoleManager.ConsoleWindowHandle, 0, 0, (int)WindowsFormsHost.ActualWidth, (int)WindowsFormsHost.ActualHeight, true);
Run Code Online (Sandbox Code Playgroud)
但是,有一个大问题.出于某种原因,控制台窗口具有渲染工件.就好像它不会在左下角和右上角重新粉刷一样.工件的宽度类似于标题栏的宽度和粗边框,事实上,如果我留下工件大小的粗边框下降.但只是重新绘制它将无济于事,因为它再次出现.例如,我可以将窗口从屏幕上移开并再次返回以修复它,但它很快就会重新出现:
渲染神器http://img837.imageshack.us/img837/6241/renderissue.png
更新2:即使我不将它父进入WindowsFormsHost控件,效果也会发生.我需要做的就是重现它是启动控制台(使用AllocConsole())然后用SetWindowLong删除它的标题栏.这是一台win7机器.
更新3:似乎"弄乱"其他类似的窗口不受支持.假设有一个标题,控制台窗口计算其textarea,所以没有办法解决这个问题.我认为我在WPF中获得类似控制台的行为的唯一选择是编写自定义WinForms控件然后将其嵌入到WPF中.
我正在尝试设置并获取应用程序退出代码.
我正在尝试做以下事情:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
if ( e.Args.Length != 0)
{
}
else
{
new MainWindow().ShowDialog();
}
Environment.ExitCode = 110;
this.Shutdown();
}
Run Code Online (Sandbox Code Playgroud)
然后我试图cmd通过它echo %ERRORLEVEL%
但我总是得到结果0,任何想法是什么问题?
请阅读Scott Chamberlain的答案,了解为什么它与WINAPI有关.
在Visual Studio中创建一个新的WPF应用程序并更改代码,MainWindow.xaml.cs如下所示.运行该应用程序.代码将在第二次调用时挂起Console.Write().
MainWindow.xaml.cs
using System;
using System.Text;
using System.Windows;
namespace TestWpf
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
byte[] msg = new byte[1024];
string msgStr = Encoding.Default.GetString(msg);
for (int i = 0; i < 10; i++)
{
Console.Write(msgStr);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在Visual Studio中创建一个新的控制台应用程序,Program.cs并按如下所示更改代码.运行该应用程序.它将成功运行,即它不会挂起.
Program.cs中
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{ …Run Code Online (Sandbox Code Playgroud) 我正在考虑创建一个像终端窗口一样的WPF或Silverlight应用程序.除了,因为它在WPF/Silverlight中,它将能够通过效果,图像等"增强"终端体验.
我正试图找出模拟终端的最佳方法.我知道如何处理VT100仿真,就解析等而言.但是如何显示呢?我考虑过使用RichTextBox并将VT100转义代码转换为RTF.
我看到的问题是性能.终端可能一次只能获得几个字符,并且为了能够将它们加载到文本框中,我将不断创建TextRanges并使用Load()来加载RTF.此外,为了完成每个加载"会话",它必须完全描述RTF.例如,如果当前颜色为红色,则每个加载到TextBox中都需要RTF代码才能使文本变为红色,或者我认为RTB不会将其加载为红色.
这似乎非常多余 - 由仿真构建的RTF文档将非常混乱.此外,插入符号的移动似乎不是理想情况下RTB处理的.我需要一些自定义的东西,但是这让我很害怕!
希望听到明亮的想法或指向现有解决方案.也许有一种方法可以在其上嵌入一个实际的终端和覆盖物.我发现的唯一的东西是旧的WinForms控件.
更新:在下面的答案中查看由于perf的建议解决方案是如何失败的.:(
Windows WPF或Silverlight中的VT100终端仿真
我有一个简单的WPF应用程序.在正常使用下,App.xaml将启动MainWindow.xaml.但我想设置它,以便如果使用特殊的命令行参数调用它,它将作为控制台应用程序.
所以这里大概是我的App.xaml.cs文件的样子:
using System;
namespace MyProject
{
public partial class App : Application
{
public void App_OnStartup(object sender, StartupEventArgs e)
{
if (e.Args.Length == 1 && e.Args[0].Equals("/console"))
{
Console.WriteLine("this is a test");
Environment.Exit(0);
}
else
{
var mainWindow = new MainWindow();
mainWindow.Show();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望当我从命令行运行时MyProject.exe /console,它会打印字符串"这是一个测试".但是现在它没有打印任何东西.我怎样才能让它发挥作用?
只是.我在这里发现了一个类似的问题:c#console,Console.Clear问题
但那没有回答这个问题.
更新 :
Console.Clear()抛出:IOException(句柄无效)
该应用程序是一个WPF应用程序.然而,写入控制台完全没有问题,也没有读取.
我正在运行一个相当大的种子作为压力测试,我想知道是否可以向控制台显示输出.
我想显示其余的条目或完成百分比,或者其他任何内容.
有没有办法在update-database期间写入控制台或包管理器控制台?
c# ×10
wpf ×9
console ×5
.net ×4
batch-file ×1
cmd ×1
command-line ×1
pinvoke ×1
silverlight ×1
terminal ×1
uwp ×1
vt100 ×1
winapi ×1
windows-10 ×1
xaml ×1