如何暂停执行并等待获胜应用程序中的按键操作?

时间:2014-09-07 14:18:20

标签: c# debugging vbscript keypress

我正在使用c#(在VS2012上工作 - .Net 4.5)实现调试器,它应该如下工作:(这是一个使用msscript.ocx控件的vbscript调试器)

在带断点的行上它应该等待{F5}键,并且在有{F5}键时它应该移动到下一个代码行。

现在的问题是,在调试方法中(此方法在命中断点时调用)继续在循环中移动检查静态变量设置为true(控件上的按键事件将此静态变量设置为true )。

应用程序没有响应,我必须停止它。

以下是代码:

以下代码在TextBox的KeyPress事件中实现: 只要它收到{F5}键,它就会在静态变量中设置为真。

static bool dVar;
private void fctb_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.F5)
{
    //Setting the static variable true when the control recieves a {F5} key
    dVar = true;
}
}

现在点击断点后面的函数被称为

    public void DebugIT()
    {
        dVar=false

            //Waits for the  {F5} key press by checking for the static variable 
           //The Application goes Un-Responsive on this Loop and stops accepting keys
            while (dVar!=true)
            {
                System.Threading.Thread.Sleep(1000); 
            }           


        }



    }

这里的问题是,当它进入while循环时,它会停止接受按键并且没有响应。

需要一种暂停代码执行的方法,直到它收到所需的按键。

或者

我们是否可以有一个单独的线程来检查{F5}键按下并且不会使应用程序无响应。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

以下是如何执行此操作的示例 如果您希望使用此确切代码,请创建一个新表单并拖放两个按钮和一个文本框。

public partial class Form1 : Form
{
    ManualResetEvent man = new ManualResetEvent(false);
    public Form1()
    {
        InitializeComponent();
        button1.Click += button1_Click;
        button2.Click += button2_Click;
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        textBox1.Enabled = false;//Do some work before waiting
        await WaitForF5();       //wait for a button click or a key press event or what ever you want
        textBox1.Enabled = true; //Continue
    }

    private Task WaitForF5()
    {

       return Task.Factory.StartNew(() =>
        {
            man.WaitOne();
            man.Reset();
        }
        );
    }

    private void button2_Click(object sender, EventArgs e)
    {
        man.Set();
    }
}

在上面的示例中,当您单击button1时,文本框被禁用,当您按下第二个按钮时,将再次启用。 这是在不阻止UI

的情况下完成的

答案 1 :(得分:0)

您需要在while循环中添加DoEvents。请参阅MSDN

中的示例