2015-03-30 4 views
1

У меня есть только базовое понимание языка C#, но я обеспокоен, моя программа использует Powershell для выполнения задач.C# Ждите ввода пользователя, затем продолжайте код

Моя особая проблема: я не могу подключить другой обработчик событий, который может прослушивать нажатие клавиши после того, как пользователь нажал кнопку, я объясню.

  1. пользователь нажимает кнопку нажмет
  2. Network след начинается с помощью PowerShell (а пользовательские элементы управления, когда остановить трассировку)
  3. Моего темпа решения для отображения MessageBox, когда закрыто ..
  4. Остановит network trace

Есть ли в любом случае я могу заменить свое окно сообщений, где пользователь может нажать пробел, чтобы остановить трассировку?

Спасибо за ваше время и помогите заранее.

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

Ответ предоставлен Энди Ланнгом над проектом кода; 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 продолжает работать некоторое время, блокируя другие события.

Предлагаю вам ознакомиться с методами Threading и Async. Вот один из способов (не полностью протестирована)

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

Вам нужно будет сделать несколько изменений для этой работы, таких как настройка, если заявления и где пс объявлена.

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

Hi Rufus, Это, безусловно, подход, который я не рассматривал и действительно выполняет эту работу! Благодарим за помощь :) – Matt416

+0

Привет, Руфус, я не отмечен вашим ответом. Я хотел бы пойти с моим первоначальным планом! Прости. – Matt416

+0

Что это за план? –

Смежные вопросы