Не используйте Thread.Sleep
!
Установите KeyPreview
формы на true
и используйте ключевые события формы.
Это позволит вам получать уведомления о ключевых событиях без задержки и без замораживания интерфейса.
См. Также этот ответ - Winforms: перехват события мыши сначала в главной форме, а не в элементах управления .
Вместо этого вы также можете использовать игровой API. Они позволяют очень быстро реагировать на события мыши и клавиш и не привязаны к элементам управления. Они также позволяют обнаруживать одновременные нажатия клавиш.
Поскольку вы не делаете это в пользовательском интерфейсе (согласно вашему комментарию), я предлагаю другой подход:
В игре вы обычно используете игровой цикл, который зацикливается максимально быстро, без задержки Thread.Sleep
. В каждом цикле вы проверяете текущее состояние ввода (клавиатура, мышь, джойстик), обновляете состояние игры и отображаете соответственно.
В каждом цикле сохраняйте текущее время с помощью DateTime.UtcNow
(быстрее, чем DateTime.Now
) и проверяйте время, прошедшее с момента, когда действие выяснило, достигнута ли необходимая задержка.
Если DateTime
недостаточно точен, используйте класс StopWatch
. См .: Точность и точность DateTime .