C#等待用户输入然后继续代码

时间:2015-03-30 22:27:06

标签: c# powershell

我只对C#语言有基本的了解,但我很困扰,我的程序使用Powershell来执行任务。

我的具体问题是我无法附加另一个事件处理程序,它可以在用户点击按钮后监听按键,我将解释。

  1. 用户点击按钮
  2. 网络跟踪开始使用powershell(用户控制何时停止跟踪)
  3. 我的临时解决方案是在关闭时显示消息框..
  4. 停止网络跟踪
  5. 无论如何我可以替换我的消息框,用户可以按空格键来停止跟踪吗?

    谢谢您的时间和提前帮助。

    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");
    
    /////////
    
    }
    

2 个答案:

答案 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的位置。