4

我正在尝试模拟按键和按键动作。

例如:2638 毫秒。

SendMessage(hWnd, WM_KEYDOWN, keyCode, 0);
Sleep(2638);
SendMessage(hWnd, WM_KEYUP, keyCode, 0);

你怎么知道它是否真的有效?

4

4 回答 4

5

您不会使用此代码,因为准确测量代码执行所需的时间是一项艰巨的任务。

要解决您的问题标题所提出的问题(您应该一次只问一个问题......),所述功能的准确性由操作系统决定。在 Linux 上,系统时钟粒度为 10 毫秒,因此通过 nanosleep() 的定时进程暂停只能保证精确到 10 毫秒,即使这样也不能保证在您指定的时间内完全休眠。(见下文。)

在 Windows 上,可以更改时钟粒度以适应电源管理需求(例如,降低粒度以节省电池电量)。请参阅MSDN 关于睡眠功能的文档

请注意,使用 Sleep()/nanosleep(),操作系统仅保证进程挂起将持续至少与您指定的时间一样长。其他进程的执行总是会延迟您的进程的恢复。

因此,您上面的代码发送的按键事件将至少比按键事件晚 2.638 秒,而不是早一毫秒。但是事件有可能在 2.7、2.8 甚至 3 秒后发送。(或者如果一个实时进程控制了 CPU 并且在一段时间内没有放弃控制权,那么很久以后。)

于 2010-11-08T22:48:16.223 回答
1

Sleep根据标准的 Windows 线程调度工作。精确到大约 20-50 毫秒。

所以对于依赖用户体验的事情来说没问题。但是,它绝对不适合实时事物。

除此之外,还有更好的方法来模拟键盘/鼠标事件。请看SendInput

于 2010-11-08T22:38:40.230 回答
0

The command Sleep() will ensure that thread is suspended at least the amount of time which is given as argument. Operating system does not guarantee it. For detailed discussion you can refer the below post how is sleep implemented at OS level?

于 2014-03-17T05:37:16.330 回答
0

当请求的延迟时间短于下一次中断发生前的剩余时间时,sleep() 函数将在所需延迟之前返回。但这仅表明您希望睡眠的时间比系统当前支持的时间短。建议将多媒体定时器资源设置为更高的中断频率,以获得观察到的睡眠延迟与所需延迟的更好匹配。

以下线程中的评论:

WinXP下如何获取准确的1ms Timer Tick

睡眠时间少于一毫秒

于 2012-07-13T13:45:58.063 回答