编辑:感谢lunarquaker的帮助。下面是现在使用批准答案中的setLabel方法的代码。变量"发送者"和" e"被改为" sender2"和" e2"因为这发生在已经使用"发送者"的按钮内部。和" e"变量
Process process = new Process();
string command = @"/K C:\ti\uniflash_3.4\uniflashCLI.bat -config C:\users\david\desktop\twinHM\TTwin9V.usf -setOptions com=3 -operations program";
process.StartInfo.FileName = "CMD.exe";
process.StartInfo.Arguments = command;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.OutputDataReceived += (sender2, e2) => setLabelText(lblCMDResponse, e2.Data);
lblCMDResponse.Visible = true;
process.Start();
process.BeginOutputReadLine();
和setLabel方法
private void setLabelText(Label label, string text)
{
if (label.InvokeRequired)
{
label.Invoke((System.Action)(() => setLabelText(label, text)));
}
else
{
label.Text = text;
}
}
我正在编写一个C#应用程序来处理创建参数文件,然后将该文件和二进制文件闪存到微处理器。在后端我真的使用uniflash命令行工具进行闪烁,但是我想要隐藏任何看起来很像的东西" computery"或" techy"来自我的用户(因为我认为它会吓到他们)因此我想在CMD运行时隐藏它,我不想打开并出于同样的原因显示控制台,但我想得到从CMD响应(逐行),然后将该响应写入我的用户将看到的标签。在大多数情况下,我希望这个标签的变化太快,用户无法读取它,但它会提醒他们任何问题(主要是确保设备已插入并且交换机设置为FTDI)
我无法弄清楚如何做到这一点。
这是我到目前为止在该部分所做的事情:
Process process = new Process();
string command = @"/K C:\ti\uniflash_3.4\uniflashCLI.bat -config C:\users\david\desktop\twinHM\TTwin9V.usf -setOptions com=3 -operations program";
process.StartInfo.FileName = "CMD.exe";
process.StartInfo.Arguments = command;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.Start();
我知道在开始之前我需要订阅OutputDataRecieved事件并以某种方式将其设置为我的标签。我使用this thread作为示例,但是当我尝试将其插入其中时,会抱怨(发件人,e)部分,因为它们可以找到这些变量。我也认识到Console.WriteLine(stuff)与设置标签的text属性完全相同,我不知道如何用最新的消息持续更新该标签< / p>
我将继续阅读OutputDataReceived的文档,看看我是否能够理解我在那里做错了什么(除非有人在这里回答)但我真的很感激任何帮助附加到标签上(或者是它实际上就像将输出设置为text属性一样简单吗?)
答案 0 :(得分:0)
也许我错过了什么。使用InvokeRequired检查创建setLabelText方法不起作用吗?首先,您对OutputDataReceived事件的订阅将其与设置标签的方法相关联:
process.OutputDataReceived += (sender, e) => setLabelText(myLabel, e.Data);
然后,更新标签的方法:
private void setLabelText(Label label, string text)
{
if (label.InvokeRequired)
{
label.Invoke((System.Action)(() => setLabelText(label, text)));
}
else
{
label.Text = text;
}
}