提问者采纳 由Keydown和keyup事件组合,keyDown来判定按下,此时开始移动,KeyUp判定松开,这样可行否? 追问 这是我一开始的写法,但就是因为 键盘重复延迟 导致keydown后会有一下停顿 回答 我的意思是有一个在keydown事件中有一个bool量判定是否按下了某个键,比如W,之后作为这类程序应该始终有个线程循环检测按键与画面结果显示(或渲染),最简单的有一个timer,每过一定时间间隔检查一下按键,在keyup里设定bool为松开。这种写法并不靠键盘重复时间来移动,而是靠你的循环函数速度来移动: 全局函数: System.Timers.Timer timer1; 然后是有若干bool量: bool pressW = false; 程序的构造函数里: timer1 = new System.Timers.Timer(20); timer1.Elapsed+=new System.Timers.ElapsedEventHandler(move); timer1.Start(); 你的人物keyDown事件: private void someObject_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.W) pressW = true; } KeyUP事件: private void someObject_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.W) pressW = false ; } 最后是移动函数: private void move(object sender, System.Timers.ElapsedEventArgs e) { if(pressW) someObject.Location = new Point(someObject.Location.X, someObject.Location.Y - 1); } 如果你控制的是窗体控件移动,也请使用窗体控件中的timer,不然你会遇上传说中的线程访问窗体控件问题。祝好运。 提问者评价 感谢回答 问了好多天了终于有个好心人出来了