模拟按键保持指定的时间

时间:2012-03-24 01:44:27

标签: c# .net wpf

我正在尝试模拟按住键一段时间。代码在自己的线程中运行,因此它不会中断UI。但是Sleep函数仍然在中断保持序列。我实际上想要暂时使用Sleep,必须按住键。有什么办法吗?

int delay = 2000;

keybd_event(VK_W, 0, KEYEVENTF_EXTENDEDKEY, 0);
System.Threading.Thread.Sleep(delay);
keybd_event(VK_W, 0, KEYEVENTF_KEYUP, 0);
System.Threading.Thread.Sleep(50);

这应该模拟按住键W,但它只是按下它,睡觉(它没有做任何事情),然后释放它。

1 个答案:

答案 0 :(得分:-1)

如果你想重复发送按键笔划达到指定的毫秒数,这可能会有效,但你不知道实际被按下了多少次 - 你只知道它在2000年被按下了以某种未知离散率的毫秒数。

public void DoFor(Action action, int numMilliseconds)
    {
        DateTime start = DateTime.Now;

        while (DateTime.Now.Subtract(start).TotalMilliseconds < numMilliseconds)
        {
            // Not sure - is this relevant on another thread?
            Application.DoEvents();
            // Not sure if this is relevant either since you're on another thread
            Thread.Sleep(1);
            // Do your action
            action();
        }
    }

你可以这样称呼它:

        DoFor(new Action(() =>
                             {
                                 keybd_event(VK_W, 0, KEYEVENTF_EXTENDEDKEY, 0);
                             }), 2000);
        DoFor(new Action(() =>
                             {
                                 keybd_event(VK_W, 0, KEYEVENTF_KEYUP, 0);
                             }), 50);