How can I get rid of character repeat delay in C#?

后端 未结 2 616
误落风尘
误落风尘 2020-12-10 23:10

http://www.microsoft.com/windowsxp/using/accessibility/characterrepeatrate.mspx - There\'s an option in Windows for setting repeat delay. It means the delay between first ke

相关标签:
2条回答
  • 2020-12-10 23:25

    You should be handling KeyDown and KeyUp rather than ProcessCmdKey if you want greater control over what happens between the time a key is pressed and released.

    The absolute easiest thing to do in your scenario would be to have a timer on your form that moves the monster. Enable the timer (and set some sort of variable or deltaX and deltaY that indicates how to move the monster) when KeyDown is fired, then stop the timer when KeyUp is fired.

    Edit

    As an example (very barebones)

    public class MyForm : Form
    {
        private int deltaX;
        private int deltaY;
    
        private const int movementAmount = 10;
    
        private Timer movementTimer = new Timer();
    
        public MyForm()
        {
            movementTimer.Interval = 100; // make this whatever interval you'd like there to be in between movements
    
            movementTimer.Tick += new EventHandler(movementTimer_Tick);
        }
    
        void movementTimer_Tick(object sender, EventArgs e)
        {
            myMonster.Location = new Point(myMonster.X + deltaX, myMonster.Y + deltaY);
        }
    
        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);
    
            switch (e.KeyCode)
            {
                case Keys.Left:
                    {
                        deltaX -=movementAmount;
                    } break;
                case Keys.Right:
                    {
                        deltaX += movementAmount;
                    } break;
                case Keys.Up:
                    {
                        deltaY -= movementAmount;
                    } break;
                case Keys.Down:
                    {
                        deltaY += movementAmount;
                    } break;
            }
    
            UpdateTimer();
        }
    
        protected override void OnKeyUp(KeyEventArgs e)
        {
            base.OnKeyUp(e);
    
            switch (e.KeyCode)
            {
                case Keys.Left:
                    {
                        deltaX += movementAmount;
                    } break;
                case Keys.Right:
                    {
                        deltaX -= movementAmount;
                    } break;
                case Keys.Up:
                    {
                        deltaY += movementAmount;
                    } break;
                case Keys.Down:
                    {
                        deltaY -= movementAmount;
                    } break;
            }
    
            UpdateTimer();
        }
    
        private void UpdateTimer()
        {
            movementTimer.Enabled = deltaX != 0 || deltaY != 0;
        }
    }
    
    0 讨论(0)
  • 2020-12-10 23:33

    I don't like timers and pInvoke.

    In a WinForms program I solved unwanted key repeat as follows

        List<Keys> cKeys = new List<Keys>() { Keys.Q, Keys.W, Keys.E, Keys.R,
           Keys.T, Keys.Y, Keys.U, Keys.I, Keys.O, Keys.P, 
           Keys.OemOpenBrackets, Keys.OemCloseBrackets };  // define relevant keys
      
        Keys keepc = Keys.IMENonconvert; // some key which is not relevant
    
        private void Form2_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode!=keepc) // repeater detect
            {
                keepc = e.KeyCode;
                if (cKeys.IndexOf(e.KeyCode) >= 0) // if relevant key..
                {
                    // do press key action
                }
            }         
        }
    
        private void Form2_KeyUp(object sender, KeyEventArgs e)
        { 
            keepc = Keys.IMENonconvert; // reset the repeater detect
            if (cKeys.IndexOf(e.KeyCode) >= 0) // if relevant key..
            {
                // do release key action
            }
        }
    
    0 讨论(0)
提交回复
热议问题