我有以下代码:
while(MouseKeyboardStateTest.Keyboard.IsKeyDown(Keys.Space))
{
Keyboard.KeyPress(Keys.A);
Thread.Sleep(asChecker.currentDelay);
for (int i = 0; i <= asChecker.currentMouseClicks; i++)
{
Mouse.PressButton(Mouse.MouseKeys.Right);
Thread.Sleep(globalMouseDelay);
}
}
它工作正常,问题是-Thread.Sleep
不准确,并且延迟并不总是相同。
我还有其他方法可以解决此问题,使其至少精确到10ms吗?
答案 0 :(得分:2)
完全不要使用Thread.Sleep
!
将表单的KeyPreview
设置为true
并使用表单的键事件。
这将使您获得关键事件的通知,而不会出现滞后,也不会循环冻结UI。
另请参见this answer至Winforms : Intercepting Mouse Event on Main Form first, not on Controls。
您也可以改用游戏API。这些使您可以非常快速地对鼠标和键事件做出反应,而不必与控件绑定。它们还使您能够检测同时按键。
由于您不是在用户界面中执行此操作(根据您的评论),所以我建议采用另一种方法:
在游戏中,您通常使用尽可能快地循环的游戏循环,没有任何Thread.Sleep
延迟。在每个循环中,您都要检查输入的当前状态(键盘,鼠标,操纵杆),并更新游戏状态并进行相应显示。
在每个循环中,用DateTime.UtcNow
(比DateTime.Now
更快的时间)保存当前时间,并检查自从某个操作发生以来经过的时间,以了解是否已达到所需的延迟。
如果DateTime
不够准确,请使用StopWatch
类。参见:Precision and accuracy of DateTime。