我只对C#语言有基本的了解,但我很困扰,我的程序使用Powershell来执行任务。
我的具体问题是我无法附加另一个事件处理程序,它可以在用户点击按钮后监听按键,我将解释。
无论如何我可以替换我的消息框,用户可以按空格键来停止跟踪吗?
谢谢您的时间和提前帮助。
public void button3_Click(object sender, EventArgs e)
{
///////////
ps.AddScript("netsh trace start persistent=yes capture=yes tracefile=" + progpath + @"\nettrace.etl");
ps.Invoke();
MessageBox.Show("Press OK to stop the trace");
ps.AddScript("netsh trace stop");
/////////
}
答案 0 :(得分:1)
您可以将按钮用作切换按钮吗?类似的东西:
private static bool tracing = false;
public void button3_Click(object sender, EventArgs e)
{
if (tracing)
{
ps.AddScript("netsh trace stop");
button3.Text = "Begin trace";
ps.Invoke();
}
else
{
ps.AddScript("netsh trace start persistent=yes capture=yes tracefile=" +
progpath + @"\nettrace.etl");
button3.Text = "Stop trace";
}
tracing = !tracing;
}
答案 1 :(得分:1)
Andy Lanng在代码项目中提供的答案; http://www.codeproject.com/Questions/892139/Csharp-Wait-for-user-input-then-continue-with-code
如果这是一个winforms应用程序(" MessageBox.Show"说它是),那么按空格将触发一个事件,具体取决于哪个控件具有焦点。 隐藏复制代码
private void form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == ' ')
ps.AddScript("netsh trace stop");
}
问题在于您声明不能接受新事件。我想这是因为button3_Click事件继续运行一段时间,阻止了其他事件。
我建议你看一下线程和异步方法。这里有一种方式(未经过全面测试)
private PowerShell ps = new PowerShell { };
BackgroundWorker backgroundWorker = new BackgroundWorker();
public void button3_Click(object sender, EventArgs e)
{
backgroundWorker.DoWork +=backgroundWorker_DoWork;
backgroundWorker.RunWorkerAsync();
}
void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
ps.AddScript("netsh trace start persistent=yes capture=yes tracefile=" + progpath + @"\nettrace.etl");
ps.Invoke();
}
private void form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == ' ')
ps.AddScript("netsh trace stop");
}
您需要对此进行一些更改才能正常工作,例如调整if语句以及声明ps的位置。