У меня есть только базовое понимание языка С#, но я обеспокоен, моя программа использует 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");
/////////
}
Ответ, предоставленный Энди Ланнгом над проектом кода; 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.
Могли бы вы включить кнопку в качестве переключателя? Что-то вроде:
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;
}