C # Ждите ввода пользователя, затем продолжайте с кодом

1

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

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

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

/////////

}
Теги:
powershell

2 ответа

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

Для этого вам нужно будет сделать несколько изменений, таких как настройка операторов 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
    Привет, Руфус! Это, конечно, подход, который я не рассматривал и действительно делает свою работу! Спасибо за вашу помощь :)
  • 0
    Привет, Руфус, я не пометил твой ответ. Я хотел бы пойти с моим первоначальным планом! извиняюсь.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню