2015-03-30 144 views
1

我只对C#语言有一个基本的了解,但我很困扰,我的程序使用Powershell来执行任务。C#等待用户输入,然后继续输入代码

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

  1. 用户点击按钮
  2. 网络跟踪开始使用的powershell(用户控制何时停止跟踪)
  3. 我的临时解决方法是,以显示一个消息,当该闭合..
  4. 停止网络跟踪

是否有反正我可以代替我的消息框,用户可以按空间停止跟踪?

谢谢你的时间和事先帮助。

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

///////// 

} 

回答

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声明等工作。

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; 
} 
+0

嗨Rufus, 这当然是一种我没有考虑过的方法,确实做这项工作! 谢谢你的帮助:) – Matt416 2015-03-30 22:56:28

+0

嗨,鲁弗斯,我没有标记你的答案。我想用我原来的计划去!抱歉。 – Matt416 2015-03-31 11:54:11

+0

这是什么计划? – 2015-04-02 02:47:02